궁극적으로는 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.TYPE
및 Concat
mli는이 경우 거의 동일합니다. 내가 만든 concat_type.ml
의 유일한 이유는 Join
의 functor를 지원하고 concat
구현을 모방 한 모듈에 적용하려고하면 무엇을 볼 수 있는지 명시 적으로 제한하는 것이 었습니다.
Concat_type.TYPE
을 Concat
인터페이스로 가져 오거나 그 반대로 또는 그 반대로 중복을 피하려면 다른 방법으로 가져올 수 있습니까?
당신은 단지'사용 concat.mli에 Concat_type.TYPE'을 포함 할 수 있어야한다, 내가 예를 들어,'모듈 가입, 당신은'Concat'의 모듈 유형을 사용할 수 있습니다 – glennsl
생각 :하지만 여전히 가능성이 있습니다 (X : Concat의 모듈 유형) : sig ...'. – gsg