Аппликативные против генеративных функторов - PullRequest
0 голосов
/ 04 сентября 2018

Я недавно изучал SML, когда узнал термины - аппликативные и генеративные функторы . Я также знаю, что SML использует генеративные функторы.

Я попытался найти термины в Google, но не смог найти ни одного убедительного ресурса, объясняющего, что означают эти термины и в чем различия между ними.

Итак, я просто хотел узнать действительное значение этих терминов каким-то практически нестабильным образом и как это связано с тем, что SML является порождающим .

1 Ответ

0 голосов
/ 04 сентября 2018

Это связано с равенством абстрактных типов в модуле, являющемся результатом применения функтора.

Генерация означает, что два вызова функтора будут создавать модули, содержащие неравные абстрактные типы.

Аппликативный означает, что два вызова функтора будут создавать модули, содержащие равные абстрактные типы , если аргументы в некотором смысле равны (например, синтаксически идентичны).

Я приведу пример в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...