Recursion 复杂模与函子结构中的签名失配错误

Recursion 复杂模与函子结构中的签名失配错误,recursion,types,module,ocaml,functor,Recursion,Types,Module,Ocaml,Functor,我用模块构建了一个复杂的结构,里面有一个递归。编译给了我一个我无法解决的错误(尽管我不认为这真的是由于递归)。有人能帮忙吗 首先,定义了一个接口区域和一个函子区域: (* 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 wi

我用模块构建了一个复杂的结构,里面有一个递归。编译给了我一个我无法解决的错误(尽管我不认为这真的是由于递归)。有人能帮忙吗

首先,定义了一个接口
区域
和一个函子
区域

(* 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
(* 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
一个函子
ZonesmFun
和一个接口
ZONESM
,其元素是从
String
区域的映射,具有相同的属性:

(* 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
(* 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
中,编译顺序与上面列出的文件的顺序相同。然后编译器在
模块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

我不擅长递归模块类型,但是。。。我想你的例子可以简化为以下内容

module type S = sig type t end
module rec R : S = (R : S with type t = int)
由于签名不匹配,OCaml拒绝此代码。这是因为R在等式的左右手中有不兼容的类型。你必须说:

module rec R : S with type t = int = (R : S with type t = int)
因为R是递归定义的,所以R必须具有相同的模块类型

如果不是递归的,您可以说:

module M = struct type t = int end
module N : S = (M : S with type t = int)

等式左侧的模块类型可能比右侧更抽象。

这些模块具有文件间的相互依赖性。你确定你能正确编译zone*.ml文件吗?是的,我刚刚检查了
makefile
的输出,它们的
.cmi
.cmx
编译得很好…啊,好的,第一个代码是两个文件…一个独立的文件更容易复制。。。