let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
是弱多态,但涉及ref
。
编写弱多态函数的任何方法没有涉及ref
或partial application
?
答案 0 :(得分:4)
不确定。模块抽象将实现它,实质上是指示编译器放弃有关实现的所有信息:
module Example : sig
type 'a t
val create : unit -> 'a t
end = struct
type 'a t = int
let create () = 0
end
和弱多态结果:
# let x = Example.create ();;
val x : '_a Example.t = <abstr>
(注意,如果你想在这里使用多态,你可以使用方差注释来恢复它。)
基于除ref
(数组,可变字段)之外的可变结构构建示例也很容易,但这不是很有启发性,因为它几乎是一样的。
答案 1 :(得分:1)
其他可变数据结构(如数组,bigarray,对象和其他结构)可以构造create: unit -> 'a t
或create: some_type -> 'a t
形式,以便可以在不实际创建的情况下创建它们向编译器证明它们将具有指定的类型。