2013-08-30 3 views
3

모듈 유형 PROP과 일치하는 EEA을 비롯한 여러 모듈을 만들었습니다. 지금은 다음과 같은 2 펑터를 구축하고 싶습니다 : 재귀가 있기 때문에여러 펑터 내에서 재귀 실현

(* modules.ml *) 
open EEA 
open Zone 
open Zones 
module ZoneEEA = ZoneFun(EEA) 
module ZonesEEA = ZonesFun(ZoneEEA) 

그러나, 코드가 작동하지 않습니다

(* zone.ml *) 
module type ZONE = 
sig 
    ... 
end 
module ZoneFun (Prop : PROP) = struct 
    type t = 
    { i: int; 
     pal: ZonesEEA.t } 
    ... 
end 

(* zones.ml *) 
module ZonesFun (Zone: ZONE) = struct 
    type t = Zone.t list 
    ... 
end 

는 따라서 펑 날 모듈을 구축 할 수 있도록 할 : ZoneFun ... 따라서 ZoneFun, ZoneEEA에서 제공하는 ZonesEEA.t 필요

사람이 재귀를 실현하기 위해 코드를 재구성 할 생각이 있습니까?

+0

당신이 ZoneFun.t''필드'pal'의 유형을 추출 또는'의 구현을 않는 경우는 OK 있을까 ZoneFun'은 그것에 의존합니까? 기본적으로 묻는 것은,'ZoneFun'의'ZonesEEA'에 대한 종속성을 제거 할 수 없습니까? – nickie

+0

'ZoneFun'의 구현은 실제로'pal'에 의존하지 않지만'ZoneEEA.t'는'ZonesEEA.t' 유형의 필드'pal'를 갖기를 원합니다. 나는 당신이 "ZoneFun.t'에서 필드'pal'를 추상화 한 것을 정확히 모른다 ... – SoftTimur

답변

0

모듈간에 재귀가 필요합니다. 이것은 원형 의존성을 만들어 내며 OCaml에서 그렇게 할 수 없습니다. 그러나 에 pal 유형을 추상화 할 수 있다면이 트릭을 수행 할 수 있습니다. 나는 하나의 매개 변수를 ZoneFun 펑터에 추가하고 있습니다.이 펑터의 타입은 pal입니다. 나는이 파라미터를 Z이라고 부르고 나중에 ZonesEEA으로 인스턴스화 될 것이므로 ZONES 타입을 제공 할 것입니다.

(* zone.ml *) 
module type ZONES = sig 
    type t 
    ... 
end 

module ZoneFun (Prop : PROP) (Z : ZONES) = struct 
    type t = 
    { i: int; 
     pal: Z.t } 
    ... 
end 

그런 다음, ZoneEEAZonesEEA 상호 재귀 모듈 될 것입니다 :

(* modules.ml *) 
open EEA 
open Zone 
open Zones 

module rec ZoneEEA : ZONE = ZoneFun(EEA)(ZonesEEA) 
and ZonesEEA : ZONES = ZonesFun(ZoneEEA) 
+0

당신의 의견을 보내 주셔서 감사합니다.'EEA'를 포함한 몇몇 모듈들은'PROP'와' PROP'가 필요합니다 .ZoneFun과 ZonesFun은'ZONE'과'ZONES' 타입의 모듈을 만드는 데 사용됩니다. 당신이'ZoneFun'을'moduleZoneFun (Prop : PROP) (ZS : ZONEES) = 구조체 타입 t = {i : int; pal : ZS.t}', 그러나이 경우 어떻게 재귀 적으로'ZONESEEA'를 시작할 수 있습니까?'module ZoneEEA = ZoneFun (EEA) (ZonesEEA) '에 이어'module ZonesEEA = ZonesFun (ZoneEEA)'? – SoftTimur

+0

'PROP'는't' 타입을 포함하고 있습니까? 그렇다면 functor에 두 개의 매개 변수가 필요하지 않습니다. 대신에'PROP'를 사용할 수 있습니다 – nickie

+0

'PROP'는't' 타입을 포함하고 있습니다 ... 'pal'의 타입은'ZonesEEA.t' ('s') 또는'ZS.t'를 사용합니다. 'Zt' ... – SoftTimur