Хотя я не был в комитете по дизайну, я считаю, что синтаксис записей был сформирован так, чтобы соответствовать синтаксису списка. Синтаксис экспорта модуля также использует запятые, единственное реальное место, где используется компоновка, - это объявления верхнего уровня, где используются предложения и нотации.
Кроме того, учитывая
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"