Haskellレコードの構文に不快な感じがします


9

Haskell構文のほとんどには、純粋さの美しさがあります。しかし、レコードの構文は醜く見えます。それは不快です。Cとの何らかの混合を感じます。コンマと中括弧が必要です。Haskellにはタブ、行ベースの分離があります。そのため、本来必要とするよりも冗長に見えます。なぜそのように設計されているのですか?


4
私にはハスケルのすべてが奇妙に感じています。私に何ができる?
仕事を

7
あなただけではありません。レコードの(現在の具体化)について不満を言う人はかなりいます。

Eonil:レコードの構文が本当に嫌いな場合は、{-#NoTraditionalRecordSyntax#-} GHC拡張を使用して無効にすることができます。
DanielDíazCarrete 14年

回答:


8

私はデザイン委員会にいなかったが、レコード構文はリスト構文と一致するように形作られていたと思う。モジュールのエクスポート構文もコンマを使用します。レイアウトが使用される唯一の実際の場所は、トップレベルの宣言であるwhere句とdo表記です。

その上、与えられた

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

書き込み

fnord x = x { bar = 4 }

中括弧がないと、残りの構文と衝突し、レイアウトを使用すると、

fnord x = x
    bar = 4

構文は非常に脆弱になります。間違った場所に「場所」を追加すると、コードはまったく異なるものを意味します。

あなたは(あなたがそれを一人ではないでしょう)ハスケルのレコードの状態に満足していない場合、私はあなたが見てい推奨しfclabelsのような、あるいは精巧な型クラスの牛車HListグレープフルーツ・レコードを(後者二つはされていませんかすかな心の、しかしめちゃくちゃ強力な)

fclabelsはあなたが書くことを可能にします(そう、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"

うーん。いsetL平均可変の?? IOなし?ITを理解するのは難しい...
Eonil、2011

2
レコード構文と同様に、単一のフィールドが変更されたレコードの別の(共有)コピーを取得することはまったくありません。変更可能性や参照透過性の中断は含まれません。
barsoap
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.