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

次に、コンパイルにより、 in の行でエラーが発生しCalculate.tries xます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

実際にofCalculate.ZonesType.tと同じであることをコンパイラにどのように伝えることができますか?ZonesType.tabs.ml

4

1 に答える 1

1

問題は、モジュール ZoneType と ZonesType を 2 回定義することです。最初の宣言を隠すため、2 番目の宣言を削除する必要があります。ファイル abs.ml で、2 行を削除します。module Zone...

Ocaml では同じ名前を複数回使用できますが、その場合、新しい宣言によって以前の宣言が隠されます。

于 2013-07-30T17:48:27.370 に答える