链接由2个文件中的仿函数生成的2个模块

时间:2013-07-30 17:17:16

标签: types module ocaml functor

我已定义了以下几个模块:

(* 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}}相同?

1 个答案:

答案 0 :(得分:1)

问题是你定义了两次模块ZoneType和ZonesType。您应该删除第二个声明,因为它隐藏了第一个声明。 在你的文件abs.ml中,删除2行module Zone...

Ocaml允许您多次使用相同的名称,但在这种情况下,新的声明将隐藏先前的声明。