Czuję się nieswojo przy składni rekordu Haskell

9

Większość składni Haskell ma piękno czystości. Ale składnia rekordu wygląda brzydko. To niewygodne. Czuje coś w rodzaju mieszanki z C. Wymaga przecinka i nawiasów klamrowych. Haskell ma tabulator, separacja liniowa. Wygląda więc zbyt wyczerpująco, niż początkowo wymaga. Dlaczego jest tak zaprojektowany?

Eonil
źródło
4
Dla mnie cała Haskell czuje się dziwnie. Co mogę zrobić?
Job
7
Nie jesteś sam Sporo osób narzeka na (obecne wcielenie) zapisy.
Eonil: Jeśli naprawdę nie znosisz składni rekordów, możesz ją wyłączyć za pomocą rozszerzenia GHC {- # NoTraditionalRecordSyntax # -}.
Daniel Díaz Carrete

Odpowiedzi:

8

Chociaż nie byłem w komisji projektowej, uważam, że składnia rekordu została ukształtowana tak, aby była spójna ze składnią listy. Moduł w składni eksportu również używa przecinków, jedynym prawdziwym miejscem, w którym używany jest układ, są deklaracje najwyższego poziomu, w których są klauzule i notacja.

Na dodatek, biorąc pod uwagę

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

pisanie

fnord x = x { bar = 4 }

bez nawiasy klamrowe kolidowałyby z resztą składni i przy użyciu układu, jak

fnord x = x
    bar = 4

sprawiłoby, że składnia byłaby dość krucha. Dodaj „gdzie” w niewłaściwym miejscu, a kod oznacza coś zupełnie innego.

Jeśli nie jesteś zadowolony ze stanu rekordów w Haskell (i nie byłbyś z tym sam), polecam przyjrzeć się flabels, a nawet wypracować hackery typograficzne, takie jak HList lub rekordy grejpfrutowe (dwa ostatnie nie są dla osób o słabym sercu, ale także niesamowicie potężnych)

fclabels pozwoli ci pisać (yay pointfree)

fnord = setL bar 4

jak również

getBar = getL bar

na dodatek jest to raison d'etre, które tworzy etykiety:

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

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"
kostka mydła
źródło
Hmm Czy setLoznacza zmienne? Bez IO? Trudno to zrozumieć ...
Eonil
2
Wcale nie, dostaniesz kolejną (współdzielącą) kopię rekordu z jednym polem zmienionym, tak jak ze składnią rekordu. Nie wiąże się z tym żadna zmienność ani przerwa przejrzystości referencyjnej.
barsoap