2014-03-12 79 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