记录语法澄清

Mat*_*hid 2 haskell

好的,所以这是一个不寻常的.每当你看到Haskell的记录语法的例子时,它总是看起来像

Sphere {center = 0, radius = 2}
Run Code Online (Sandbox Code Playgroud)

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

Sphere
  center = 0
  radius = 2
Run Code Online (Sandbox Code Playgroud)

它有用吗?

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

dav*_*420 6

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

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

所以不,你不能使用布局作为记录语法的一部分.

Haskell Report2010§2.7布局:

Haskell通过使用布局来传达相同的信息,允许省略在几个语法制作中使用的括号和分号.


Mat*_*hid 6

好吧,我以为我会把这个问题放在这里以防任何人感兴趣.在咨询了Haskell报告本身之后,看起来大括号实际上是记录构造的正式部分:

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

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

(我也顺便EmptyDataDecls提一下,在Haskell 2010中默认情况下似乎是开启的,值得了解...)

  • @MathematicalOrchid§2.7表示布局只能在`where`,`let`,`do`和`of`之后发生. (2认同)