我对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
据我了解,在上面的示例中,Make
和Make2
是完全相同的签名,但语法看起来完全不同。
我错过了什么吗?有什么不同吗?
那么有两个单独的句法结构的原因吗?历史原因? IMO将两个独立的句法结构用于同一目的是一种不好的做法。
答案 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