应用函子与生成函子
Applicative vs Generative functors
我最近一直在学习 SML,当我开始了解这些术语时 - applicative 和 generative functors。我也知道 SML 使用 generative 仿函数。
我尝试 Google 这些术语,但找不到任何令人信服的资源来解释这些术语的含义以及两者之间的区别。
所以,我只是想以一些实际上难以理解的方式了解这些术语的实际含义,以及这与 SML 生成。
有何关系
它与仿函数应用程序导致的模块中抽象类型的相等性有关。
生成意味着仿函数的两次调用将生成包含不相等抽象类型的模块。
适用性意味着仿函数的两次调用将生成包含相同抽象类型的模块如果参数在某种意义上是相等的(例如在语法上相同)。
我将在 OCaml 中举一个例子,因为它恰好支持:
module App (M : sig end) : sig
type t
val zero : t
end = struct
type t = int
let zero = 0
end
(* A () argument signifies a generative functor in OCaml. *)
module Gen (M : sig end) () : sig
type t
val zero : t
end = struct
type t = int
let zero = 0
end
module Empty = struct end
module A = App (Empty)
module B = App (Empty)
module C = App (struct end) (* The argument is syntactically different. *)
module D = Gen (Empty) ()
module E = Gen (Empty) ()
let _ = begin
(* A.t and B.t are compatible. *)
ignore (A.zero = B.zero); (* OK *)
(* A.t and C.t are not compatible because the functor arguments
* are not syntactically equal. *)
ignore (A.zero = C.zero); (* type error *)
(* D.t and C.t are not compatible because they are produced
* from generative functors. *)
ignore (D.zero = E.zero); (* type error *)
end
我最近一直在学习 SML,当我开始了解这些术语时 - applicative 和 generative functors。我也知道 SML 使用 generative 仿函数。
我尝试 Google 这些术语,但找不到任何令人信服的资源来解释这些术语的含义以及两者之间的区别。
所以,我只是想以一些实际上难以理解的方式了解这些术语的实际含义,以及这与 SML 生成。
有何关系它与仿函数应用程序导致的模块中抽象类型的相等性有关。
生成意味着仿函数的两次调用将生成包含不相等抽象类型的模块。
适用性意味着仿函数的两次调用将生成包含相同抽象类型的模块如果参数在某种意义上是相等的(例如在语法上相同)。
我将在 OCaml 中举一个例子,因为它恰好支持:
module App (M : sig end) : sig
type t
val zero : t
end = struct
type t = int
let zero = 0
end
(* A () argument signifies a generative functor in OCaml. *)
module Gen (M : sig end) () : sig
type t
val zero : t
end = struct
type t = int
let zero = 0
end
module Empty = struct end
module A = App (Empty)
module B = App (Empty)
module C = App (struct end) (* The argument is syntactically different. *)
module D = Gen (Empty) ()
module E = Gen (Empty) ()
let _ = begin
(* A.t and B.t are compatible. *)
ignore (A.zero = B.zero); (* OK *)
(* A.t and C.t are not compatible because the functor arguments
* are not syntactically equal. *)
ignore (A.zero = C.zero); (* type error *)
(* D.t and C.t are not compatible because they are produced
* from generative functors. *)
ignore (D.zero = E.zero); (* type error *)
end