Polymorphism 为什么在Ocaml中限制'ref None'值?

Polymorphism 为什么在Ocaml中限制'ref None'值?,polymorphism,ocaml,Polymorphism,Ocaml,值限制规则指出,只有当表达式的右侧在语法上是值时,才能进行泛化 我不明白为什么让r=ref None的值受到限制? 为什么ref(大约2)是一个值而ref None不是 是不是None类似于类型构造函数无不是一个值?在我看来,None是一个多态值。有没有多态性价值 在我看来,当与多个多态实体(如id或ref None)进行某种交互时,就会出现值限制 我是OCaml自学的初学者。感谢您的帮助。无论是ref None还是ref(Some 2)都不是用于值限制的值。它们都是函数ref的应用程序 谈论泛

值限制规则指出,只有当表达式的右侧在语法上是值时,才能进行泛化

我不明白为什么
让r=ref None
的值受到限制? 为什么
ref(大约2)
是一个值而
ref None
不是

是不是
None
类似于类型构造函数<代码>无不是一个值?在我看来,
None
是一个多态值。有没有多态性价值

在我看来,当与多个多态实体(如
id
ref None
)进行某种交互时,就会出现值限制


我是OCaml自学的初学者。感谢您的帮助。

无论是
ref None
还是
ref(Some 2)
都不是用于值限制的值。它们都是函数
ref
的应用程序

谈论泛化
ref(some2)
是没有意义的,因为不存在可能的多态性

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

#让我的_none=none;;
val my_none:“a选项=无”
#设fx=如果x,则有3个其他的;;
val f:bool->int选项=
#设gx=如果x,那么一些“abc”或者我的;;
val g:bool->字符串选项=
由于
my\u none
是多态的,因此它可以作为
int option
类型的值,也可以作为
string option
类型的值

更新

OCaml有一个“宽松”的值限制,使得一些非语法值的东西仍然可以被泛化(使其多态)

你可以在本文中读到关于放松值限制的内容,我经常引用。(我也会定期重读,因为随着时间的推移,我往往会忘记争论。)

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

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

ref None
是一个值(以及
ref(一些2)
…)。值限制规则是关于类型的。类型在编译时发生。值是在运行时存在的。我在这里读到的是ref None不是一个值。我正在浏览Ok中给出的语法值的更精确定义,这是有意义的,所以这里去掉的是值限制中的值的概念是“语法值”我们不认为函数应用是一个语法值,因为他们做了一些计算。但是,我想知道为什么像<代码> REF NO/<代码>不是一个语法值,像<代码> ID没有< /代码>是什么?其中,
let id=fun x->x
id None
不是语法值。它是函数
id
的应用程序。但是,OCaml有一个宽松的值限制。关于这一点,有一篇很好的论文可以读;我将在我的答案中添加链接。非常感谢。非常感谢你的帮助。
let unSome = function Some x -> x | None -> raise Not_found