2014-03-12 4 views
2

OCaml에서 (명백하게) functor의 시그니처가 두 가지 (겉으로보기에는) 전혀 다른 방식으로 정의 될 수 있다는 사실에 다소 혼란 스럽습니다. 예 : Make 위에 지금까지 내가 이해, 예에서OCaml의 Functor 시그널

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 

Make2 완전히 동일한 서명하고, 아직 구문은 매우 근본적으로 다른 보이는 다음 .mli 파일에 내가 쓸 수 있습니다. 내가 빠진 것이 있습니까? 어떤 차이가 있습니까?

두 개의 구문 구조가 서로 다른 이유는 무엇입니까? 역사적인 이유? IMO 동일한 목적으로 사용되는 두 개의 별도 구문 구문을 사용하는 것은 나쁜 습관입니다.

답변

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