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

Ocaml 在不涉及ref或部分应用程序的情况下,是否可以编写弱多态性函数?,ocaml,value-restriction,Ocaml,Value Restriction,是弱多态性,但涉及ref 编写弱多态函数而不涉及ref或部分应用程序的任何方法?当然。模块抽象可以做到这一点,本质上是指示编译器放弃有关实现的所有信息: let remember = let cache = ref None in (fun x -> match !cache with | Some y -> y | None -> cache := Some x; x) 弱多态性结果: module Example : s

是弱多态性,但涉及
ref


编写弱多态函数而不涉及
ref
部分应用程序的任何方法

当然。模块抽象可以做到这一点,本质上是指示编译器放弃有关实现的所有信息:

let remember =
   let cache = ref None in
    (fun x ->  match !cache with
         | Some y -> y
         | None -> cache := Some x; x)
弱多态性结果:

module Example : sig
  type 'a t
  val create : unit -> 'a t
end = struct
  type 'a t = int
  let create () = 0
end
#让x=Example.create();;
val x:'_示例。t=
(请注意,如果您想在此处使用多态性,可以使用方差注释来恢复它。)


基于非
ref
(数组、可变字段)的可变结构构造示例也很容易,但这并不是很有指导意义,因为这几乎是一样的事情。

当然。模块抽象可以做到这一点,本质上是指示编译器放弃有关实现的所有信息:

let remember =
   let cache = ref None in
    (fun x ->  match !cache with
         | Some y -> y
         | None -> cache := Some x; x)
弱多态性结果:

module Example : sig
  type 'a t
  val create : unit -> 'a t
end = struct
  type 'a t = int
  let create () = 0
end
#让x=Example.create();;
val x:'_示例。t=
(请注意,如果您想在此处使用多态性,可以使用方差注释来恢复它。)


基于除
ref
(数组、可变字段)以外的可变结构构造示例也很容易,但这并不是很有指导意义,因为这几乎是一样的。

可以使用其他可变数据结构,如数组、bigarray、对象和其他结构,其构造形式为
create:unit->'a t
create:some_type->'a t
,因此可以创建它们,而无需向编译器实际证明它们将具有指定的类型

其他可变数据结构,如数组、bigarray、对象和其他结构,其构造形式为
create:unit->'a t
,或
create:some-type->'a t
,因此可以在不向编译器实际证明它们将具有指定类型的情况下创建它们

值得指出的是,值限制在任何地方都没有提到
ref
ref
没有什么特别之处,除了(在放松的值限制下)它在子类型方面是不变的。
ref
在SML中更为特殊,SML是最初提出值限制的背景。在SML中,记录是不可变的,只有
ref
s(和数组?)是可变的。因此,关于值限制的大量讨论自然涉及
ref
。当然,在OCaml中,
ref
只是带有可变字段的记录的一个实例。值得指出的是,值限制在任何地方都没有提到
ref
ref
没有什么特别之处,除了(在放松的值限制下)它在子类型方面是不变的。
ref
在SML中更为特殊,SML是最初提出值限制的背景。在SML中,记录是不可变的,只有
ref
s(和数组?)是可变的。因此,关于值限制的大量讨论自然涉及
ref
。当然,在OCaml中,
ref
只是带有可变字段的记录的一个实例。