记录语法澄清

时间:2013-03-06 21:09:56

标签: haskell

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

Sphere {center = 0, radius = 2}

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

这样的东西
Sphere
  center = 0
  radius = 2

并且有效吗?

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

3 个答案:

答案 0 :(得分:6)

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

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

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

Haskell Report 2010 §2.7 Layout:

  

Haskell允许省略几个语法制作中使用的大括号和分号,使用 layout 来传达相同的信息。

答案 1 :(得分:6)

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

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

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

(我还顺便提一下,Haskell 2010默认情况下EmptyDataDecls似乎处于启用状态,这值得了解...)

答案 2 :(得分:1)

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

z = x
     + y

要么,是吗?