【发布时间】:2013-03-11 19:12:29
【问题描述】:
有人可以简要说明何时开始放宽价值限制吗?我很难找到对规则的简洁明了的描述。这是 Garrigue 的论文:
http://caml.inria.fr/pub/papers/garrigue-value_restriction-fiwflp04.pdf
但它有点密集。有人知道更简洁的来源吗?
附录
下面添加了一些很好的解释,但我无法找到以下行为的解释:
# let _x = 3 in (fun () -> ref None);;
- : unit -> 'a option ref = <fun>
# let _x = ref 3 in (fun () -> ref None);;
- : unit -> '_a option ref = <fun>
任何人都可以澄清以上内容吗?为什么封闭 let 的 RHS 中的 ref 的杂散定义会影响启发式。
【问题讨论】:
-
出于类型检查的目的,OCaml 编译器不会区分您的第二个示例
let _x = ref 3 in (fun () -> ref None)和let r = ref None in (fun () -> r),因为类型检查器不会查看let的主体查看是否实际使用了绑定变量(正如人们所期望的那样)。但是let r = ref None in (fun () -> r)如果是多态类型的,可能会导致不合理的行为(即段错误),因此为了安全起见,您的第二个示例是单态类型的。 Details in my answer below -
Oleg Kiselyov 的Efficient and Insightful Generalization 很好地解释了这一点(以及更多)。它也有点密集,但有很多例子。
标签: ocaml