3

我想知道为什么在 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不起作用:

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

type... and为什么和之间的范围界定不一致 let...and

4

1 回答 1

9

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

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

关于您的第二个示例,这与范围无关,而是某些递归定义的有效性,而不是其他定义。这是一个完全正交的问题(请参阅递归定义有效的ocaml 手册let rec),并且在范围内完全按照您的意愿行事。

于 2011-07-17T18:13:29.943 回答