当我想检查一些关于仿函数声明的语法时,我遇到了这个问题。我提出了两个相互矛盾的语法定义,而标准ML '97的语法,正如其名称所暗示的那样,应该是标准的一部分,在“标准ML的定义 - 修订”中定义。
“The definition of Standard ML — Revised”, by R. Milner, page 14, on Google Books说:
fundec ::= functor funbinf
funbind ::= funid (strid : sigexp) = strexp <and funbind>
我把它读成“一个仿函数只有一个参数,不能说与签名相符”。
“Standard ML syntax summary”, by L. Paulson, page 2, on PDF说(架构大致使用与SML '97定义中相同的表示法重新表达):
FunctorDeclaration ::= functor FunctorBinding <and FunctorBinding>
FunctorBinding ::= Ident ( FunctorArguments ) : Signature = Structure
FunctorArguments ::= Ident : Signature | Specification
我把它读作“一个仿函数可能会得到多个参数,可以说是与签名匹配”。
这两个文件说的不同,所以我很困惑。标准ML '97的真正定义是什么?或者我只是错过阅读标准定义?
答案 0 :(得分:2)
定义的第2章和第3章仅提供该语言的简单语法。这是通过附录A中定义的“派生形式”(即语法糖)进行扩展,其中包括funid (spec)
形式(funid (X : sig spec end)
的缩写形式,其中X
在RHS上打开)
请参阅here以获取完整的SML语法,包括所有派生形式。