Mi sento a disagio con la sintassi dei record di Haskell


9

La maggior parte della sintassi di Haskell ha bellezza di purezza. Ma la sintassi del record sembra brutta. È scomodo. Sembra una specie di miscuglio con C. Richiede virgola e parentesi graffe. Haskell ha una tabulazione, una separazione basata su linee. Quindi sembra troppo prolisso di quanto inizialmente richiesto. Perché è progettato in questo modo?


4
Per me tutto Haskell è strano. Cosa posso fare?
Giobbe

7
Non sei solo. Molte persone si lamentano dei record (dell'attuale incarnazione di).

Eonil: se odi davvero la sintassi dei record, puoi disabilitarla con l'estensione GHC {- # NoTraditionalRecordSyntax # -}.
Daniel Díaz Carrete,

Risposte:


8

Anche se non facevo parte del comitato di progettazione, ritengo che la sintassi del record fosse modellata per essere coerente con la sintassi dell'elenco. La sintassi di esportazione del modulo utilizza anche le virgole, l'unico luogo reale in cui viene utilizzato il layout sono le dichiarazioni di livello superiore, in cui clausole e notazione.

Inoltre, dato

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

scrittura

fnord x = x { bar = 4 }

senza le parentesi graffe si scontrerebbe con il resto della sintassi e usando il layout, come

fnord x = x
    bar = 4

renderebbe la sintassi piuttosto fragile. Aggiungi un "dove" nel posto sbagliato e il tuo codice significa qualcosa di completamente diverso.

Se non sei soddisfatto dello stato dei record in Haskell (e non lo sarai da solo), ti consiglio di dare un'occhiata a fclabels o persino a elaborati hacker di tipo da tavolo come HList o dischi di pompelmo (questi ultimi due non sono per i deboli di cuore, ma anche follemente potente)

fclabels ti permetterebbe di scrivere (yay pointfree)

fnord = setL bar 4

così come

getBar = getL bar

in cima alla sua vera ragion d'essere, che sta componendo le etichette:

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

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"

Hmm. Fa setLmutabile media ?? Senza IO? È difficile da capire ...
Eonil,

2
Niente affatto, otterrai un'altra (condivisione) copia del record con un singolo campo modificato, proprio come con la sintassi del record. Nessuna mutabilità o rottura della trasparenza referenziale coinvolta.
barsoap,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.