Functors cho phép viết code bất chấp cấu trúc dữ liệu cài đặt là gì, và cho phép tạo ra các hàm (functions) có thể thay đổi được.
(http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual004.html#toc15)
2.3 Functors
Functors are “functions” from structures to structures. They are used to express parameterized structures: a structure A parameterized by a structure B is simply a functor F with a formal parameter B (along with the expected signature for B) which returns the actual structure A itself. The functor F can then be applied to one or several implementations B1 …Bn of B, yielding the corresponding structures A1 …An.For instance, here is a structure implementing sets as sorted lists, parameterized by a structure providing the type of the set elements and an ordering function over this type (used to keep the sets sorted):
# type comparison = Less | Equal | Greater;; type comparison = Less | Equal | Greater # module type ORDERED_TYPE = sig type t val compare: t -> t -> comparison end;; module type ORDERED_TYPE = sig type t val compare : t -> t -> comparison end # module Set = functor (Elt: ORDERED_TYPE) -> struct type element = Elt.t type set = element list let empty = [] let rec add x s = match s with [] -> [x] | hd::tl -> match Elt.compare x hd with Equal -> s (* x is already in s *) | Less -> x :: s (* x is smaller than all elements of s *) | Greater -> hd :: add x tl let rec member x s = match s with [] -> false | hd::tl -> match Elt.compare x hd with Equal -> true (* x belongs to s *) | Less -> false (* x is smaller than all elements of s *) | Greater -> member x tl end;; module Set : functor (Elt : ORDERED_TYPE) -> sig type element = Elt.t type set = element list val empty : 'a list val add : Elt.t -> Elt.t list -> Elt.t list val member : Elt.t -> Elt.t list -> bool endBy applying the Set functor to a structure implementing an ordered type, we obtain set operations for this type:
# module OrderedString = struct type t = string let compare x y = if x = y then Equal else if x < y then Less else Greater end;; module OrderedString : sig type t = string val compare : 'a -> 'a -> comparison end # module StringSet = Set(OrderedString);; module StringSet : sig type element = OrderedString.t type set = element list val empty : 'a list val add : OrderedString.t -> OrderedString.t list -> OrderedString.t list val member : OrderedString.t -> OrderedString.t list -> bool end # StringSet.member "bar" (StringSet.add "foo" StringSet.empty);; - : bool = false
Không có nhận xét nào:
Đăng nhận xét