是否可以在不涉及ref或部分应用的情况下编写弱多态函数?

时间:2014-10-11 11:52:10

标签: ocaml value-restriction

let remember =
   let cache = ref None in
    (fun x ->  match !cache with
         | Some y -> y
         | None -> cache := Some x; x)

是弱多态,但涉及ref

编写弱多态函数的任何方法没有涉及refpartial application

2 个答案:

答案 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 tcreate: some_type -> 'a t形式,以便可以在不实际创建的情况下创建它们向编译器证明它们将具有指定的类型。