На самом деле в грамматике 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
(в то время как обратное утверждение верно).
Извините за педантичный ответ, но сам вопрос был довольно точным. Я не уверен, что начало .. Обработка конца - самая элегантная часть грамматики OCaml (в ней много бородавок). Можно было бы пожелать, чтобы они действительно были эквивалентны, но тогда нет смысла настаивать на написании begin x : int end
вместо (x : int)
.