值限制规则说只有当表达式的右侧在语法上是一个值时,才会发生泛化。
我不明白为什么let r = ref None
受到价值限制?
为什么ref (Some 2)
是值而ref None
不是?
None
是否类似于构造函数? None
不是值吗?在我看来,None
是一个多态值。有多态值吗?
在我看来,当与id id
或ref None
等多个多态实体进行某种交互时会发生价值限制。
我是OCaml做自学的初学者。任何帮助表示赞赏。
答案 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 None
和ref (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有一个“宽松”的值限制,其中一些非语法值的东西仍然可以被推广(变成多态)。
您可以阅读本文中的宽松价值限制,我经常引用。 (我也定期重读它,因为随着时间的推移,我倾向于忘记这个论点。)