Sono abbastanza bloccato con il seguente problema di functor in OCaml. Incollo parte del codice solo per farti capire. FondamentalmenteComprensione dei funtori in OCaml
Ho definito questi due moduli in 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
e la seguente funtore:
module Make(P: ProbPA): (M with type s = P.t) = struct
type s = P.t
(* implementation *)
end
Poi utilizzare effettivamente questi moduli ho definito un nuovo modulo direttamente in un file denominato 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 *)
Da una terza fonte (formulas.ml
) Ho usato il funtore con Prism
modulo:
module PrismPctl = Pctl.Make(Prism)
open PrismPctl
E infine dal main.ml
open Formulas.PrismPctl
(* code to prepare the object *)
PrismPctl.check_suite s.sys_state suite (* error here *)
e compila dà il seguente errore
Error: This expression has type Prism.state = Prism.value array but an expression was expected of type Formulas.PrismPctl.s
Da quello che posso capire che ci una sorta di cattivo aliasing dei nomi, sono gli stessi (dal value array
è il tipo definito come t
e viene utilizzato M with type s = P.t
nel functor) ma il controllo di tipo non li considera uguali.
Davvero non capisco dov'è il problema, qualcuno può aiutarmi?
Grazie in anticipo
Non so abbastanza di OCaml per aiutare, ma è possibile che questa domanda precedente è un problema simile? http://stackoverflow.com/questions/640510/functors-in-ocaml – Gian
@Gian: è lo stesso problema di root, ma se lo capisci, sei già sulla buona strada per non aver bisogno di porre la domanda nel primo posto. – Gilles