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