在Ocaml中"类型...和"和"让...和"之间的范围界定

zel*_*ell 3 ocaml types let scoping

我想知道为什么在Ocaml中,"让......和......"没有"类型......和......"那样的范围:

下面的一个是好的,t2在与t1相同的范围内

# type t1 = t2 
and t2 = int;;
Run Code Online (Sandbox Code Playgroud)

以下是WRONG,v2 in not in the scoping

# let v1 = v2
and v2 = 3;;

  Characters 9-11:
  let v1 = v2
           ^^

Error: Unbound value v2
Run Code Online (Sandbox Code Playgroud)

甚至"让rec"也行不通......

# let rec v1 = v2
and v2 = 3;;

  Characters 13-15:
  let rec v1 = v2
               ^^
Error: This kind of expression is not allowed as right-hand side of `let rec'
Run Code Online (Sandbox Code Playgroud)

为什么"类型......和"与"让...和"之间的范围不一致?谢谢.

gas*_*che 9

类型是隐式递归的.如果你想使用"let"获得相同的效果,请使用"let rec .. and".

在理想的语言中,绑定表单应该有两个版本,一个是递归的,一个是非递归的.这就是letCaml 的情况,你有letlet rec.没有可访问的非递归类型绑定形式; 它不一定是默认的,甚至type nonrec ...会做.这是Caml语法的缺陷; 例如,在这篇博客文章中给出了无法递归类型定义的不良后果.

关于你的第二个例子,这不是关于范围界定,而是某些递归定义的有效性而不是其他定义.这是一个完全正交的问题(请参阅ocaml手册,其中递归定义是有效的),并且let rec确实完全符合您的要求,确定范围.