Siento algo incómodo con la sintaxis de grabación de Haskell

9

La mayor parte de la sintaxis de Haskell tiene belleza de pureza. Pero la sintaxis de registro se ve fea. Es incómodo. Se siente una especie de mezcla con C. Requiere coma y llaves. Haskell tiene tabulación, separación basada en línea. Por lo tanto, se ve demasiado detallado de lo que originalmente requiere. ¿Por qué está diseñado de esa manera?

Eonil
fuente
44
Para mí, todo Haskell se siente raro. ¿Que puedo hacer?
Trabajo
77
No estas solo Muchas personas se quejan de (la encarnación actual de) los registros.
Eonil: Si realmente odias la sintaxis de grabación, puedes deshabilitarla con la extensión {- # NoTraditionalRecordSyntax # -} GHC.
Daniel Díaz Carrete

Respuestas:

8

Si bien no estaba en el comité de diseño, considero que la sintaxis de los registros fue conformada para ser consistente con la sintaxis de la lista. La sintaxis de exportación del módulo también usa comas, el único lugar real donde se usa el diseño son las declaraciones de nivel superior, donde las cláusulas y la anotación.

Además de eso, dado

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

escritura

fnord x = x { bar = 4 }

sin las llaves chocarían con el resto de la sintaxis, y usando el diseño, como

fnord x = x
    bar = 4

haría la sintaxis bastante frágil. Agregue un "dónde" en el lugar equivocado y su código significa algo completamente diferente.

Si no está satisfecho con el estado de los registros en Haskell (y no estaría solo con eso), le recomiendo que eche un vistazo a las etiquetas o incluso a la elaboración de hackers de clase tipo como HList o registros de toronja (los dos últimos no son para los débiles de corazón, pero también increíblemente poderosos)

fclabels te permitiría escribir (yay pointfree)

fnord = setL bar 4

tanto como

getBar = getL bar

además de su verdadera razón de ser, que es componer etiquetas:

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

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"
barra de jabón
fuente
Hmm ¿ setLSignifica mutable? Sin IO? Es difícil de entender ...
Eonil
2
De ninguna manera, obtendrá otra copia (compartida) del registro con un solo campo cambiado, al igual que con la sintaxis de registro. No hay mutabilidad o ruptura de la transparencia referencial involucrada.
barsoap