Types “之间范围界定的不一致性”;键入…和“和”;及;让……和;在Ocaml中

Types “之间范围界定的不一致性”;键入…和“和”;及;让……和;在Ocaml中,types,ocaml,scoping,let,Types,Ocaml,Scoping,Let,我想知道为什么在Ocaml中,“let..and…”与“type…and…”没有相同的范围: 下面的一个是正常的,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 即使是“让记录”也不起作用 # let rec v1 = v

我想知道为什么在Ocaml中,“let..and…”与“type…and…”没有相同的范围:

下面的一个是正常的,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
即使是“让记录”也不起作用

# 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'

为什么“类型…和”和“让…和”之间的范围不一致?多谢各位

类型是隐式递归的。如果您想与“let”具有相同的效果,请使用“let rec..and”

在理想的语言中,有意义的绑定形式应该有两个版本,一个是递归的,一个是非递归的。Caml中的
let
就是这种情况,您有
let
let rec
。没有可访问的非递归类型绑定形式;它不必是默认值,即使是
类型nonrec…
也可以。这是Caml语法的一个缺陷;例如,给出了非递归类型定义功能失效的不良后果


关于第二个例子,这不是关于范围的,而是关于某些递归定义的有效性,而不是其他定义的有效性。这是一个完全正交的关注点(请参见递归定义的有效性),并且
让rec
在这里做您想要做的事情,从范围上看。

类型是隐式等递归的。要获得同构递归类型,需要使用编译器上的
-rectypes
标志。这里所感知到的不一致性只是语法中的一个缺点,不值得对此大惊小怪。实际上不需要
类型的nonrec。。。还有…
用语言构造,就像
let。。。而且。。。在…
构造中。@james:我想你弄错了,
-rectypes
启用等递归(名称与其展开之间的相等),而标准代数数据类型是同构递归(同构,由构造函数介导,名称与其展开之间)。但这与范围界定问题无关(这个名称在范围中可用吗?)。关于
nonrec
这件事,你读过我链接到的博客文章吗?这篇文章展示了强制递归类型定义所造成的真正烦恼?对于后代来说:
typenonrec
现在是一件事了。