Mi sento a disagio con la sintassi dei record di Haskell

9

La maggior parte della sintassi di Haskell ha una bellezza di purezza. Ma la sintassi del record sembra brutta. È a disagio Sembra una specie di miscela con C. Richiede virgola e parentesi graffe. Haskell ha una tabulazione, una separazione basata sulla linea. Quindi sembra troppo prolisso di quello che in origine richiede. Perché è progettato in questo modo?

    
posta Eonil 16.02.2011 - 04:05
fonte

1 risposta

8

Sebbene non fossi membro del comitato di progettazione, ritengo che la sintassi del record sia stata modellata per essere coerente con la sintassi delle liste. La sintassi di esportazione del modulo utilizza anche le virgole, l'unico posto reale in cui viene utilizzato il layout è le dichiarazioni di livello superiore, dove clausole e notazione.

Inoltre, dato

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

scrittura

fnord x = x { bar = 4 }

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

fnord x = x
    bar = 4

renderebbe la sintassi abbastanza 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 saresti rimasto solo con questo), ti consiglio di dare un'occhiata a fclabels o anche elaborato hackery typeclass come HList o grapefruit-records (questi ultimi due non sono per i deboli di cuore, ma anche follemente potenti)

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"
    
risposta data 16.02.2011 - 10:59
fonte

Leggi altre domande sui tag