2017-10-17 6 views
2

궁극적으로는 1) 모듈 (따라서 mli 파일)에 대한 가시성을 제한하고 2) 인수가 "canonical 구현 "은 ml/mli 쌍으로 존재하며 인수는이 표준 구현과 동일한 모양을 유지한다고 주장합니다.OCaml은 mli 파일과 ml 파일 내의 서명 사이의 구조를 공유합니다.

가정하자 내가 문자열 연결

(* concat.ml *) 
type t = string 
let concat x y = x^y 

에 대한 하나의 함수를 포함하는 파일 concat.ml을하고 난 그러나 나는 또한처럼 보이는 펑 join이 그것을

(* concat.mli *) 
type t 
val concat : t -> t -> t 

위한 인터페이스를 가지고 이 모양은 Concat과 같은 모양을 가지고 있습니다. (join의 구현은 의도적으로 순진입니다) :

(* concat_type.ml *) 
module type TYPE = sig 
    type t 
    val concat : t -> t -> t 
end 
:

이 제약은 "CONCAT와 같은 모양"을 표현하기 위해
(* join.ml *) 
module Join(X : Concat_type.TYPE) : sig 
    val join : X.t list -> X.t 
end = struct 
    let rec join xs = match xs with 
    | [] -> failwith "can't be empty" 
    | [x] -> x 
    | [x; y] -> X.concat x y 
    | (x::xs') -> X.concat x (join xs') 
end 

, I는 다음과 같습니다 다른 ml 파일 concat_type.ml을 했어

Concat_type.TYPEConcatmli는이 경우 거의 동일합니다. 내가 만든 concat_type.ml의 유일한 이유는 Join의 functor를 지원하고 concat 구현을 모방 한 모듈에 적용하려고하면 무엇을 볼 수 있는지 명시 적으로 제한하는 것이 었습니다.

Concat_type.TYPEConcat 인터페이스로 가져 오거나 그 반대로 또는 그 반대로 중복을 피하려면 다른 방법으로 가져올 수 있습니까?

+1

당신은 단지'사용 concat.mli에 Concat_type.TYPE'을 포함 할 수 있어야한다, 내가 예를 들어,'모듈 가입, 당신은'Concat'의 모듈 유형을 사용할 수 있습니다 – glennsl

+2

생각 :하지만 여전히 가능성이 있습니다 (X : Concat의 모듈 유형) : sig ...'. – gsg

답변

1

예, 모듈 유형 Concat_type.TYPE을 통해 Concat 모듈 인터페이스를 표현할 수 있습니다. 기존 모듈의 모듈 유형을 가져올 수도 있습니다.

첫 번째 방법은 다음과 같습니다

(* concat.mli *) 
include Concat_type.TYPE 

두 번째 방법은 개인적으로 싫어하지만 나는 module type of 구조를 좋아하지 않는다대로의 Concat_type 제거 할 수 있습니다.

module type Concat = module type of Concat 

module Join (X : Concat) = struct 
    ... 
end