1

我定义了几个模块如下:

(* 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然后编译在 in行给我一个错误abs.ml

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.tof相同abs.ml

4

1 回答 1

1

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

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

于 2013-07-30T17:48:27.370 回答