2014-03-12 81 views
2

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

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是完全一致的签名,但语法看起来相当截然不同。 我错过了什么吗?有什么区别吗?

那么是否有两个单独的句法结构的原因?历史原因?国际海事组织这是一个不好的做法,有两个单独的句法结构服务于相同的目的。

回答

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 
+0

哦好吧,我明白了,这么多参数的支持不是“原生”的方式(很像多方论证功能) –

+0

是的,情况非常类似于功能:例如,可以部分应用模块。 – gsg