好的,所以这是一个不寻常的。每次看到 Haskell 的记录语法示例时,它总是看起来像
Sphere {center = 0, radius = 2}
或类似的。我的问题是……那些大括号实际上是记录语法的一部分吗?或者它们实际上是布局的简写?换句话说,你真的能写出类似的东西吗
Sphere
center = 0
radius = 2
并让它工作?
我怀疑这样做会非常有用——它占用了大量的视觉空间——但我只是好奇这在语法上是否有效。
好的,所以这是一个不寻常的。每次看到 Haskell 的记录语法示例时,它总是看起来像
Sphere {center = 0, radius = 2}
或类似的。我的问题是……那些大括号实际上是记录语法的一部分吗?或者它们实际上是布局的简写?换句话说,你真的能写出类似的东西吗
Sphere
center = 0
radius = 2
并让它工作?
我怀疑这样做会非常有用——它占用了大量的视觉空间——但我只是好奇这在语法上是否有效。
布局是显式大括号和分号的替代方案。
记录语法使用显式大括号和逗号。
所以不,您不能将布局用作记录语法的一部分。
Haskell 允许省略几个语法产生式中使用的大括号和分号,通过使用布局来传达相同的信息。
好的,我想我会把这个问题放在这里,以防有人感兴趣。在查阅了 Haskell 报告本身之后,看起来大括号实际上是记录结构的正式部分:
http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-690004.2.1
这意味着这些标记在 Haskell 中实际上有两个不同的含义——在不使用布局时作为声明分隔符,以及作为记录分隔符。我敢打赌,这会导致一些有趣的解析器边缘案例!
(顺便EmptyDataDecls
提一下,Haskell 2010 中似乎默认开启,这是值得知道的......)
之后Sphere
,词法分析器不会插入大括号。为什么要呢?您不希望在代码中插入大括号,例如:
z = x
+ y
或者,你呢?