我想知道为什么在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'
为什么“类型......和”与“让...和”之间的范围不一致?谢谢。
答案 0 :(得分:9)
类型是隐式递归的。如果你想用“let”获得相同的效果,请使用“let rec .. and”。
在理想的语言中,有意义的绑定表单应该有两个版本,一个是递归的,一个是非递归的。对于Caml中let
的情况就是如此,您有let
和let rec
。没有可访问的非递归类型绑定形式;它不一定是默认值,即使是type nonrec ...
也可以。这是Caml语法的缺陷;例如,in this blog post给出了无法递归类型定义的不良后果。
关于你的第二个例子,这不是关于范围界定,而是某些递归定义的有效性而不是其他定义。这是一个完全正交的问题(参见递归定义有效的ocaml manual),而let rec
完全符合您的要求,范围确定。