Sinto algo desconfortável com a sintaxe de registro Haskell

9

A maior parte da sintaxe Haskell tem beleza de pureza. Mas a sintaxe do registro parece feia. É desconfortável. Parece algum tipo de mistura com C. Requer vírgula e aparelho. Haskell possui separador, separação baseada em linha. Portanto, parece muito detalhado do que originalmente exigia. Por que é projetado dessa maneira?

Eonil
fonte
4
Para mim, Haskell parece estranho. O que eu posso fazer?
Job
7
Você não está sozinho. Muitas pessoas reclamam (da encarnação atual) de registros.
Eonil: Se você realmente odeia a sintaxe do registro, pode desativá-lo com a extensão GHC {- # NoTraditionalRecordSyntax # -}.
Daniel Díaz Carrete

Respostas:

8

Enquanto eu não estava no comitê de design, acho que a sintaxe do registro foi modelada para ser consistente com a sintaxe da lista. A sintaxe de exportação do módulo também usa vírgulas, o único local real em que o layout é usado são as declarações de nível superior, onde cláusulas e do-notation.

Além disso, dado

data Foo = Foo {bar :: Int, baz :: Int}

escrita

fnord x = x { bar = 4 }

sem os chavetas entrariam em conflito com o restante da sintaxe e, usando o layout, como

fnord x = x
    bar = 4

tornaria a sintaxe bastante quebradiça. Adicione um "where" no lugar errado e seu código significa algo completamente diferente.

Se você não estiver satisfeito com o estado dos registros em Haskell (e não ficaria sozinho com isso), recomendo que você dê uma olhada em fclabels ou até em elaborações de artigos de mesa elaborados como HList ou grapefruit-records (os dois últimos não estão sendo para os fracos de coração, mas também incrivelmente poderosos)

fclabels permitiria que você escrevesse (yay pointfree)

fnord = setL bar 4

assim como

getBar = getL bar

além de sua raison d'être real, que está compondo rótulos:

 data Person = Person { _place  :: Place, ... }
 data Place = Place { _city :: String, ... }

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"
sabão em barra
fonte
Hmm. Faz setLmutável média ?? Sem IO? É difícil entender ...
Eonil
2
De maneira alguma, você obterá outra cópia (compartilhada) do registro com um único campo alterado, assim como na sintaxe do registro. Nenhuma mutabilidade ou quebra de transparência referencial envolvida.
22411 barsoap