Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 为什么这是弱多态性_Ocaml - Fatal编程技术网

Ocaml 为什么这是弱多态性

Ocaml 为什么这是弱多态性,ocaml,Ocaml,我开始学习OCaml,并尝试进行一些练习: # let left x y = x;; val left : 'a -> 'b -> 'a = <fun> # let first = List.fold_right left;; val first : '_a list -> '_a -> '_a = <fun> #让左x y=x;; val left:'a->'b->'a= #let first=List.fold_right-left;; v

我开始学习OCaml,并尝试进行一些练习:

# let left x y = x;;
val left : 'a -> 'b -> 'a = <fun>

# let first = List.fold_right left;;
val first : '_a list -> '_a -> '_a = <fun>
#让左x y=x;;
val left:'a->'b->'a=
#let first=List.fold_right-left;;
val first:“\u a列表->”\u a->“\u a=

为什么
first
只是弱多态性而不是完全多态性?

这是值限制
first
不是一个值,它是一个函数应用程序

要获得完全多态版本,请使用eta扩展:

# let left x y = x;;
val left : 'a -> 'b -> 'a = <fun>
# let first a b = List.fold_right left a b;;
val first : 'a list -> 'a -> 'a = <fun>

如果你假装结果有type
unit->'a list ref
,你可能会使这个代码出错(我试过了)。

可能重复尝试搜索“ocaml值限制”,有很多好答案。事实上,我喜欢这个答案,你能给我解释一下,如果没有价值限制,在这种情况下有什么危害吗,说
let first=List.fold_right left
成为
val first:“列表->'a->'a=
?或者给出一个没有值限制的部分应用程序将失败的示例?或者存在值限制的原因是因为允许命令/ref?是的,存在值限制是因为
ref
。这就是为什么像Haskell这样的纯语言没有这个限制。@Tarmil我理解为什么需要值限制,但我不明白为什么部分函数应用程序需要值限制。如果没有值限制,您能否构建一个局部应用程序可能会破坏东西的情况?
# let f x = ref x;;
val f : 'a -> 'a ref = <fun>
# f [];;
- : '_a list ref = {contents = []}
# let g x = let z = ref x in fun () -> z;;
val g : 'a -> unit -> 'a ref = <fun>
# g [];;
- : unit -> '_a list ref = <fun>