查看此站点中的非官方OCaml语法,唯一begin出现的产品是:
Expression ::= begin Expression end
Run Code Online (Sandbox Code Playgroud)
还有一点看到:
Expression ::= ( Expression [:Type] )
Run Code Online (Sandbox Code Playgroud)
这一点,以及一些简单的代码中的begin/ end与(/ )在一些简单的代码(不影响正确性)的一些随意替换可能似乎表明begin end关键字只是语法糖.或者我错过了什么?
Pas*_*uoq 28
"句法糖"表示对其他构建体的简单但非平凡的翻译.begin .. end不是语法糖,它是多余的( .. ),因为它完全相同的事情.
如果您感兴趣,那么程序员可以使用begin .. end包含命令式表达式,为其副作用执行,以及( .. )使用非单位值的表达式.但编译器没有强制执行,语言的设计者只是认为如果以这种方式使用它会看起来更好,就是这样.
gas*_*che 10
实际上,对于不同的语法规则,OCaml语法中的括号有几种用法,并且并非所有这些用法都可以与begin..end一起使用.括号和begin..end可以用作无语义的表达式分隔符,用于消除歧义(如你所说expr ::= '(' expr ')').()也表示类型的常量,unit并且作为双关语,begin end也允许在那里 - 但是最后一个没有在手册中指定,只是一致地由实现支持.
但也可以使用括号
function (_::_)::_ -> ...Array.get和Array.set:t.(i) t.(i) <- e(e : t)表达式和模式中的类型注释(这不是消除歧义的分隔符的特殊情况,因为它没有括号时无效)(e :> t)和(e : s :> t)fun ~(x:int) ..和fun ?(x=10) ..对于没有这种用法可以BEGIN..END代替,所以它绝对不会是有效的,以取代(与begin和)与end系统(而相反的是正确的).
对于迂腐的回答感到抱歉,但问题本身就非常准确.我不确定begin..end处理是OCaml语法中最优雅的部分(它有很多瑕疵).人们可能希望他们真的是等同的,但是坚持写作begin x : int end而不是没有什么意义(x : int).