Я відчуваю щось незручне із синтаксисом запису Haskell


9

Більшість синтаксису Haskell має красу чистоти. Але синтаксис запису виглядає некрасиво. Це незручно. Він відчуває якусь суміш із С. Для цього потрібні кома та дужки. У Haskell є розділення на основі вкладок, ліній. Тож це виглядає занадто багатослівно, ніж потрібно спочатку. Чому він створений таким чином?


4
Мені весь Haskell дивно виглядає. Що я можу зробити?
Робота

7
Ви не самотні. Небагато людей скаржаться на (поточне втілення) записів.

Eonil: Якщо ви справді ненавидите синтаксис запису, ви можете вимкнути його за допомогою розширення GHC {- # NoTraditionalRecordSyntax # -}.
Даніель Діас Каррете

Відповіді:


8

Хоча я не був у комітеті дизайну, я вважаю, що синтаксис запису формувався так, щоб він відповідав синтаксису списку. У синтаксисі експорту модуля теж використовуються коми, єдине реальне місце, де використовується макет, - це декларації верхнього рівня, де є пропозиції та нотації.

На додаток до цього

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

написання

fnord x = x { bar = 4 }

без дужок зіткнеться з рештою синтаксису, і з використанням макета, як

fnord x = x
    bar = 4

зробив би синтаксис досить крихким. Додайте "де" в неправильному місці, а ваш код означає щось зовсім інше.

Якщо ви не задоволені станом записів у Haskell (і ви б не були на самоті з цим), я рекомендую вам ознайомитись з fclabel або навіть досконалим хакерством типу type, наприклад HList або грейпфрутовими записами (останні два не є для слабкого серця, але й шалено потужного)

fclabels дозволить вам писати (так, pointfree)

fnord = setL bar 4

так само, як

getBar = getL bar

Крім того, це фактичний raison d'etre, який створює етикетки:

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

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"

Хм. Чи setLозначає змінні ?? Без IO? Це важко зрозуміти ...
Eonil

2
Зовсім не, ви збираєтеся отримати ще одну (спільну) копію запису із зміненим одним полем, як і синтаксис запису. Ніякої змінності або порушення референтної прозорості.
barsoap
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.