2

好的,所以这是一个不寻常的。每次看到 Haskell 的记录语法示例时,它总是看起来像

Sphere {center = 0, radius = 2}

或类似的。我的问题是……那些大括号实际上是记录语法的一部分吗?或者它们实际上是布局的简写?换句话说,你真的能写出类似的东西吗

Sphere
  center = 0
  radius = 2

并让它工作?

我怀疑这样做会非常有用——它占用了大量的视觉空间——但我只是好奇这在语法上是否有效

4

3 回答 3

6

布局是显式大括号和分号的替代方案。

记录语法使用显式大括号和逗号

所以不,您不能将布局用作记录语法的一部分。

Haskell 报告 2010 §2.7 布局:

Haskell 允许省略几个语法产生式中使用的大括号和分号,通过使用布局来传达相同的信息。

于 2013-03-06T21:20:17.060 回答
6

好的,我想我会把这个问题放在这里,以防有人感兴趣。在查阅了 Haskell 报告本身之后,看起来大括号实际上是记录结构的正式部分:

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

这意味着这些标记在 Haskell 中实际上有两个不同的含义——在不使用布局时作为声明分隔符,以及作为记录分隔符。我敢打赌,这会导致一些有趣的解析器边缘案例!

(顺便EmptyDataDecls提一下,Haskell 2010 中似乎默认开启,这是值得知道的......)

于 2013-03-06T21:21:00.237 回答
1

之后Sphere,词法分析器不会插入大括号。为什么要呢?您不希望在代码中插入大括号,例如:

z = x
     + y

或者,你呢?

于 2013-03-06T21:28:15.890 回答