为什么这是弱多态的

时间:2014-10-08 22:15:40

标签: 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>

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

1 个答案:

答案 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,则可能会导致此代码出错(我试过了)。