Я застрял со следующей проблемой функторов в OCaml.Я вставляю часть кода, чтобы вы поняли.В основном
Я определил эти два модуля в pctl.ml
:
module type ProbPA = sig
include Hashtbl.HashedType
val next: t -> (t * float) list
val print: t -> float -> unit
end
module type M = sig
type s
val set_error: float -> unit
val check: s -> formula -> bool
val check_path: s -> path_formula -> float
val check_suite: s -> suite -> unit
end
и следующем функторе:
module Make(P: ProbPA): (M with type s = P.t) = struct
type s = P.t
(* implementation *)
end
Затем, чтобы фактически использовать эти модули, я определил новыймодуль непосредственно в файле с именем prism.ml
:
type state = value array
type t = state
type value =
| VBOOL of bool
| VINT of int
| VFLOAT of float
| VUNSET
(* all the functions required *)
Из третьего источника (formulas.ml
) я использовал функтор с модулем Prism
:
module PrismPctl = Pctl.Make(Prism)
open PrismPctl
И, наконец, изmain.ml
open Formulas.PrismPctl
(* code to prepare the object *)
PrismPctl.check_suite s.sys_state suite (* error here *)
и компиляция выдает следующую ошибку
Ошибка: это выражение имеет массив типа Prism.state = Prism.value, но ожидалось выражение типа Formulas.PrismPctl.s
Из того, что я могу понять, есть некое плохое совмещение имен, они одинаковы (поскольку value array
- это тип, определенный как t
, и он используется M with type s = P.t
в функторе), но средство проверки типов не считает их одинаковыми.
Я действительно не понимаю, в чем проблема, кто-нибудь может мне помочь?
Заранее спасибо