Convenções de nomenclatura para desconstrutores newtype (destruidores?)

5

Olhando para a biblioteca padrão do Haskell, podemos ver:

newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }

newtype WrappedMonad m a = WrapMonad { unwrapMonad :: m a }

newtype Sum a = Sum { getSum :: a }

Aparentemente, há (pelo menos) 3 prefixos diferentes usados para desdobrar um valor dentro de newtype : un - , run - e get- . (Além disso run - e get - capitaliza a próxima letra enquanto un - não.) Isso parece confuso.

  • Há alguma razão para isso, ou isso é apenas uma coisa histórica?
  • Se eu criar meu próprio newtype , qual prefixo devo usar e por quê?
por Petr Pudlák 12.10.2012 / 13:51
fonte

1 resposta

5

A convenção sobre capitalização é que a primeira letra de cada palavra é maiúscula. Portanto, o "w" em "desembrulhar" é minúsculo porque "desembrulhar" é uma palavra, isto é, "desembrulhar [a] mônada", não "desrolar [a] mônada".

O motivo pelo qual runStateT é nomeado runStateT é que isso descreve melhor como a função é usada - é usada para executar / executar um transformador de estado. Não faria sentido chamar os outros desconstrutores do seu exemplo runSomething porque eles não estão acostumados a executar ou executar qualquer coisa.

A distinção entre get e unwrap parece um pouco mais arbitrária (pelo menos para registros com apenas um membro), mas neste caso eu acho que a palavra unwrap foi simplesmente escolhida porque se encaixa muito bem com o nome WrappedMonad .

No final, eu diria que não é necessário escolher um nome que indiscutivelmente marca uma função como sendo um destruidor, porque isso não é realmente relevante. Portanto, a "convenção" para nomear desconstrutores é simplesmente escolher um que melhor descreva o que faz e como deve ser usado.

    
por 12.10.2012 / 14:20
fonte