我已定义了以下几个模块:
(* zone.ml *)
module ZoneFun (Prop : PROP) = (struct ... end: ZONE)
(* zones.ml *)
module ZonesFun (Zone : ZONE) = (struct ... end: ZONES)
其中PROP
是模块Type
和其他一些模块的接口。
(* calculate.ml *)
open Type
open Zone
open Zones
module ZoneType = ZoneFun(Type)
module ZonesType = ZonesFun(ZoneType)
let tries (x: ZonesType.t) : unit =
Printf.printf "haha"
(* abs.ml *)
open Type
open Zone
open Zones
open Calculate
module ZoneType = ZoneFun(Type)
module ZonesType = ZonesFun(ZoneType)
module Abs = struct
...
let abc (x: ZonesType.t) : unit =
Calculate.tries x
...
end
然后编译在Calculate.tries x
abs.ml
的{{1}}行上给出了错误:
Error: This expression has type ZonesType.t = Zones.ZonesFun(ZoneType).t
but an expression was expected of type
Calculate.ZonesType.t = Zones.ZonesFun(Calculate.ZoneType).t
我怎么能告诉编译器Calculate.ZonesType.t
实际上与ZonesType.t
的{{1}}相同?
答案 0 :(得分:1)
问题是你定义了两次模块ZoneType和ZonesType。您应该删除第二个声明,因为它隐藏了第一个声明。
在你的文件abs.ml中,删除2行module Zone...
Ocaml允许您多次使用相同的名称,但在这种情况下,新的声明将隐藏先前的声明。