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

时间:2011-07-17 16:09:53

标签: types ocaml scoping let

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

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

# type t1 = t2 
and t2 = int;;

以下一个是错误的,在范围界面中的不是v2

# let v1 = v2
and v2 = 3;;

  Characters 9-11:
  let v1 = v2
           ^^

Error: Unbound value v2

即使“让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'

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

1 个答案:

答案 0 :(得分:9)

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

在理想的语言中,有意义的绑定表单应该有两个版本,一个是递归的,一个是非递归的。对于Caml中let的情况就是如此,您有letlet rec。没有可访问的非递归类型绑定形式;它不一定是默认值,即使是type nonrec ...也可以。这是Caml语法的缺陷;例如,in this blog post给出了无法递归类型定义的不良后果。

关于你的第二个例子,这不是关于范围界定,而是某些递归定义的有效性而不是其他定义。这是一个完全正交的问题(参见递归定义有效的ocaml manual),而let rec完全符合您的要求,范围确定。