为什么Ocaml中的“ref None”值受限制?

时间:2017-12-30 04:15:35

标签: polymorphism ocaml

值限制规则说只有当表达式的右侧在语法上是一个值时,才会发生泛化。

我不明白为什么let r = ref None受到价值限制? 为什么ref (Some 2)是值而ref None不是?

None是否类似于构造函数? None不是值吗?在我看来,None是一个多态值。有多态值吗?

在我看来,当与id idref None等多个多态实体进行某种交互时会发生价值限制。

我是OCaml做自学的初学者。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:6)

可变状态不能是多态的。 ref case是首先存在价值限制的原因。考虑:

let r = ref None in     (* consider this was r : 'a option ref *)
r := Some "boo";        (* then this would be well-typed *)
unSome (!r) + 1         (* and this would be well-typed as well -- BOOM! *)

其中unSome是帮手:

let unSome = function Some x -> x | None -> raise Not_found

答案 1 :(得分:4)

ref Noneref (Some 2)都不是用于值限制的意义上的值。它们都是函数ref应用程序

由于没有可能的多态性,所以谈论泛化ref (Some 2)是没有意义的。

None是一个值,但ref None不是一个值(在用于值限制的句法意义上)。由于None是一个值,因此可以进行推广(因此它是多态的):

# let my_none = None;;
val my_none : 'a option = None

# let f x = if x then Some 3 else my_none;;
val f : bool -> int option = <fun>
# let g x = if x then Some "abc" else my_none;;
val g : bool -> string option = <fun>

由于my_none是多态的,因此它可以作为int option类型的值,也可以作为string option类型的值。

<强>更新

OCaml有一个“宽松”的值限制,其中一些非语法值的东西仍然可以被推广(变成多态)。

您可以阅读本文中的宽松价值限制,我经常引用。 (我也定期重读它,因为随着时间的推移,我倾向于忘记这个论点。)

Jacques Garrigue, Relaxing the Value Restriction