我开始学习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>
为什么first
只是弱多态而不是完全多态?
答案 0 :(得分:1)
这是价值限制。 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>
正如@ivg所指出的,这是一个常见的OCaml问题。
<强>更新强>
这是一个不太安全的功能应用程序:
# let f x = ref x;;
val f : 'a -> 'a ref = <fun>
# f [];;
- : '_a list ref = {contents = []}
如果您假装结果的类型为'a list ref
,则可能会导致代码出错(我试过了)。
这是一个部分应用,概括不安全:
# let g x = let z = ref x in fun () -> z;;
val g : 'a -> unit -> 'a ref = <fun>
# g [];;
- : unit -> '_a list ref = <fun>
如果您假装结果的类型为unit -> 'a list ref
,则可能会导致此代码出错(我试过了)。