1

内部に再帰があるモジュールで複雑な構造を構築しました。コンパイルすると、解決できないエラーが表示されます (再帰が原因だとは思いませんが)。誰でも助けてもらえますか?

最初に、インターフェースZONEとファンクターZoneFunPrecが定義されます。

(* zone.ml *)
module type ZONE = sig
  type prop
  type info 
  type t
end

(* zoneFunPrec.ml *)
open Prop
open Zonesm
module ZoneFunPrec (Prop : PROP)(Prec: ZONESM with type prop = Prop.t) = struct
  type prop = Prop.t
  type info = { mark: int option; prec: Prec.t option }
  type t = { prop: prop; info: info }
end

要素が同じプロパティを持つゾーンのリストであるファンクターZonesFunとインターフェース:ZONES

(* zones.ml *)
open Prop
open Zone
module type ZONES = sig
  type prop
  type zone
  type t  
end
module ZonesFun (Prop: PROP) (Zone: ZONE with type prop = Prop.t) = struct
  type prop = Prop.t
  type zone = Zone.t
  type t = | ZSbot | ZS of zone list
end

要素が同じプロパティを持つマップ from であるファンクターZonesmFunとインターフェイス:ZONESMStringZONES

(* zonesm.ml *)
open Prop
open Zone
open Zones
module SMap = Map.Make(String)
module type ZONESM = sig
  type prop
  type zones
  type t 
end
module ZonesmFun (Prop: PROP)
                 (Zone: ZONE with type prop = Prop.t)  
                 (Zones: ZONES with type zone = Zone.t) = struct
  type prop = Prop.t
  type zones = Zones.t
  type t = | Bot | ZSM of Zones.t SMap.t
end

EEA次に、インターフェイスがPROP次のモジュールをいくつか構築しようとします。

(* modules.ml *)
open E_expression_abs
open Zone
open ZoneFunPrec
open Zones
open Zonesm
module EEA = E_expression_abs
module rec ZoneEEA : ZONE = ZoneFunPrec(EEA)(ZonesmEEA)
and ZonesEEA : ZONES = ZonesFun(EEA)(ZoneEEA)
and ZonesmEEA : ZONESM = ZonesmFun(EEA)(ZoneEEA)(ZonesEEA)

私のmakefileでは、コンパイルの順序は、上記のファイルをリストした順序と同じです。次に、コンパイラは次の行でエラーを返しますmodule rec...

File "domains/modules.ml", line 7, characters 45-54:
Error: Signature mismatch:
       Modules do not match:
         sig
           type prop = ZonesmEEA.prop
           type zones = ZonesmEEA.zones
           type t = ZonesmEEA.t
         end
       is not included in
         sig type prop = EEA.t type zones type t end
           Type declarations do not match:
         type prop = ZonesmEEA.prop
       is not included in
         type prop = EEA.t

どうやら、コンパイラZonesEEA.propは実際にはEEA.t...

4

1 に答える 1