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)
为什么"类型......和"与"让...和"之间的范围不一致?谢谢.
类型是隐式递归的.如果你想使用"let"获得相同的效果,请使用"let rec .. and".
在理想的语言中,绑定表单应该有两个版本,一个是递归的,一个是非递归的.这就是letCaml 的情况,你有let和let rec.没有可访问的非递归类型绑定形式; 它不一定是默认的,甚至type nonrec ...会做.这是Caml语法的缺陷; 例如,在这篇博客文章中给出了无法递归类型定义的不良后果.
关于你的第二个例子,这不是关于范围界定,而是某些递归定义的有效性而不是其他定义.这是一个完全正交的问题(请参阅ocaml手册,其中递归定义是有效的),并且let rec确实完全符合您的要求,确定范围.