OCaml에서 상호 재귀 적 모듈 정의를 사용할 때는 .ml
파일에서도 서명을해야합니다. 이것은 .mli
에서 제공된 인터페이스를 공개하려는 성가신 일로, 서명을 두 번 반복합니다. :(!왜 OCaml에서 상호 재귀 적 모듈의 서명이 필요한가?
module rec Client : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ server: ('serv,'cli) Server.t
; (* other members ... *)
}
end
and Server : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ mutable clients: ('serv,'cli) Client.t list
; mutable state: 'serv
}
(* functions again ... *)
end
이 내가 뭘하는지의 대략적인 근사치 (Client
형 객체를 인스턴스화 Server
알고있다. Server
의 자신의 Client
의 알). 물론
, 서명은 . .mli
반복 왜 이런 일이 필요하다
(참고 :. 내가 불평 아니지만, 실제로는 유형 이론 또는 "하드 컴파일러 문제"이것에 대한 - 관련 이유가 있는지 알고 싶어)?
그건 의미가 있습니다. 사실, 나는이 "feature"를'.mli'에서 외부 소비자들에게 다른 타입 시그니처를 노출시킴으로써 사용한다; 나는 깨달았어야했다. – Ashe
좋은 추측입니다. 상호 회귀 적 모듈과 펑터의 경우 추론은 일반적으로 결정 불가능하기 때문에 유형 주석이 필요합니다. 이 문헌은 형식 시스템을 수정하여 최소한의 주석 요구 사항을 최적화하고 건전성을 유지하려는 시도로 가득합니다. 주석 요구 사항 부담을 줄이기 위해 OCaml의 형식 시스템을 개선 할 수 있는지 여부는 논쟁의 여지가있다. –