Я чувствую что-то неудобное с синтаксисом записи на Haskell

9

Большая часть синтаксиса Haskell имеет красоту чистоты. Но синтаксис записи выглядит безобразно. Это неудобно. Чувствуется какая-то смесь с С. Требуется запятая и фигурные скобки. В Haskell есть вкладка, разделение строк. Так что это выглядит слишком многословно, чем изначально требуется. Почему он разработан таким образом?

Eonil
источник
4
Для меня весь Хаскелл чувствует себя странно. Что я могу сделать?
Работа
7
Вы не одиноки. Довольно много людей жалуются на (текущее воплощение) записей.
Eonil: Если вы действительно ненавидите синтаксис записей, вы можете отключить его с помощью расширения {- # NoTraditionalRecordSyntax # -} GHC.
Даниэль Диас Керрет

Ответы:

8

Хотя я не был в комитете по дизайну, я считаю, что синтаксис записей был сформирован так, чтобы соответствовать синтаксису списка. Синтаксис экспорта модуля также использует запятые, единственное реальное место, где используется компоновка, - это объявления верхнего уровня, где используются предложения и нотации.

Кроме того, учитывая

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

письмо

fnord x = x { bar = 4 }

без фигурных скобок будет конфликтовать с остальной частью синтаксиса, и используя макет, как

fnord x = x
    bar = 4

сделал бы синтаксис довольно хрупким. Добавьте «где» в неправильном месте, и ваш код означает что-то совершенно другое.

Если вас не устраивает состояние записей в Haskell (и вы не останетесь наедине с этим), я рекомендую вам взглянуть на fclabels или даже тщательно продумать хакерство типов классов, таких как HList или grapefruit -records (последние два не являются для слабонервных, но тоже безумно мощных)

fclabels позволит вам написать (yay pointfree)

fnord = setL bar 4

а также

getBar = getL bar

В довершение всего, это реальный смысл, который составляет лейблы:

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

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"
barsoap
источник
Хм. Значит ли setLизменчивый ?? Без IO? Это трудно понять ...
Eonil
2
Вовсе нет, вы получите другую (разделяющую) копию записи с одним измененным полем, как с синтаксисом записи. Нет изменчивости или нарушения ссылочной прозрачности.
barsoap