Ich fühle mich mit der Syntax der Haskell-Aufnahme etwas unwohl

9

Der größte Teil der Haskell-Syntax hat Schönheit der Reinheit. Aber die Datensatzsyntax sieht hässlich aus. Es ist unangenehm. Es fühlt sich wie eine Mischung mit C an. Es erfordert Komma und Klammern. Haskell hat eine tabellenbasierte, linienbasierte Trennung. Es sieht also zu ausführlich aus als ursprünglich erforderlich. Warum ist es so gestaltet?

Eonil
quelle
4
Für mich fühlt sich ganz Haskell komisch an. Was kann ich tun?
Job
7
Du bist nicht allein. Nicht wenige Leute beschweren sich über (die aktuelle Inkarnation von) Aufzeichnungen.
Eonil: Wenn Sie die Datensatzsyntax wirklich hassen, können Sie sie mit der GHC-Erweiterung {- # NoTraditionalRecordSyntax # -} deaktivieren.
Daniel Díaz Carrete

Antworten:

8

Während ich nicht im Designkomitee war, bin ich der Meinung, dass die Datensatzsyntax so gestaltet wurde, dass sie mit der Listensyntax übereinstimmt. Die Modul-Exportsyntax verwendet ebenfalls Kommas. Der einzige wirkliche Ort, an dem das Layout verwendet wird, sind Deklarationen der obersten Ebene, wobei Klauseln und Do-Notation.

Darüber hinaus gegeben

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

Schreiben

fnord x = x { bar = 4 }

ohne die geschweiften Klammern würde mit dem Rest der Syntax kollidieren und Layout verwenden, wie

fnord x = x
    bar = 4

würde die Syntax ziemlich spröde machen. Fügen Sie ein "wo" an der falschen Stelle hinzu und Ihr Code bedeutet etwas völlig anderes.

Wenn Sie mit dem Stand der Aufzeichnungen in Haskell nicht zufrieden sind (und damit nicht allein wären), empfehle ich Ihnen, sich fclabels oder sogar ausgefeilte Typklassen - Hackery wie HList oder Grapefruit-Aufzeichnungen anzusehen (die beiden letzteren sind es nicht für schwache Nerven, aber auch wahnsinnig mächtig)

Mit fclabels können Sie schreiben (yay pointfree)

fnord = setL bar 4

ebenso gut wie

getBar = getL bar

obendrein ist es die eigentliche Existenzberechtigung, die Labels komponiert:

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

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"
Blockseife
quelle
Hmm. Bedeutet setLveränderlich? Ohne IO? Es ist schwer zu verstehen ...
Eonil
2
Überhaupt nicht, Sie werden eine weitere (Freigabe-) Kopie des Datensatzes erhalten, wenn ein einzelnes Feld geändert wird, genau wie bei der Datensatzsyntax. Keine Veränderlichkeit oder Unterbrechung der referenziellen Transparenz.
Barsoap