2

OK、これは珍しいものです。Haskell のレコード構文の例を見るたびに、常に次のようになります。

Sphere {center = 0, radius = 2}

または類似。私の質問は...これらの中括弧は実際にレコード構文の一部ですか? それとも、実際にはレイアウトの省略形ですか? つまり、実際に次のようなものを書くことができますか

Sphere
  center = 0
  radius = 2

それは機能していますか?

これを行うことが非常に役立つとは思えません-多くの視覚スペースを占有します-しかし、これが構文的に有効かどうかについては興味があります.

4

3 に答える 3

6

レイアウトは、明示的なブレースとセミコロンの代替手段です。

レコード構文では、明示的な中かっことコンマを使用します。

いいえ、レイアウトをレコード構文の一部として使用することはできません。

Haskell Report 2010 §2.7 レイアウト:

Haskell では、レイアウトを使用して同じ情報を伝えることにより、いくつかの文法生成で使用される中括弧とセミコロンを省略できます。

于 2013-03-06T21:20:17.060 に答える
6

わかりました、まあ、誰かが興味を持っている場合に備えて、この質問をここに置くと思いました。Haskell Report 自体を調べたところ、中括弧は文字どおりレコード構造の正式な部分であることがわかります。

http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-690004.2.1

つまり、Haskell では、これらのトークンには実際には 2 つの異なる意味があります。レイアウトが使用されていないときの宣言区切り記号と、レコード区切り記号です。これは、いくつかの興味深いパーサー エッジ ケースにつながるに違いありません!

EmptyDataDecls(ついでに、Haskell 2010 ではデフォルトでオンになっているように見えることにも注意してください。これは知っておく価値があります...)

于 2013-03-06T21:21:00.237 に答える
1

の後Sphere、レクサーはブレースを挿入しません。なぜそれが必要なのですか?次のようなコードにブレースが挿入されるとは思わないでください。

z = x
     + y

どちらかですよね?

于 2013-03-06T21:28:15.890 に答える