OCaml中的Functor签名

时间:2014-03-12 12:03:15

标签: ocaml functor

我对OCaml中的(显然)仿函数签名可以用两种(看似)完全不同的方式定义这一事实让我感到有些困惑。例如。在.mli文件中我可以写:

module type A = sig
    type a
end

module type SigA = sig
    type t
end

module Make (MA : SigA) :
    A with type a := MA.t

module type Make2 = functor (MA : SigA) -> A with type a := MA.t

据我了解,在上面的示例中,MakeMake2是完全相同的签名,但语法看起来完全不同。 我错过了什么吗?有什么不同吗?

那么有两个单独的句法结构的原因吗?历史原因? IMO将两个独立的句法结构用于同一目的是一种不好的做法。

1 个答案:

答案 0 :(得分:2)

这是语法糖,与函数类似(即let f x y = ...let f = fun x -> fun y -> ...的简写)。据推测,动机可能是长篇形式的多参数函数变得很难阅读:

module type A = sig end
module type B = sig end
module type C = sig end

module Foo (A:A) (B:B) (C:C) = struct
end

module Foo2 = functor (A:A) -> functor (B:B) -> functor (C:C) -> struct
end