Estoy bastante atrapado con el siguiente problema de functor en OCaml. Pego algo del código solo para que entiendas. BásicamenteEntender los funtores en OCaml
que definen estos dos módulos en 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
y la siguiente funtor:
module Make(P: ProbPA): (M with type s = P.t) = struct
type s = P.t
(* implementation *)
end
Luego de utilizar realmente estos módulos he definido un nuevo módulo directamente en un archivo llamado 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 *)
De una tercera fuente (formulas.ml
) que utiliza el funtor con Prism
módulo:
module PrismPctl = Pctl.Make(Prism)
open PrismPctl
Y finalmente, desde main.ml
open Formulas.PrismPctl
(* code to prepare the object *)
PrismPctl.check_suite s.sys_state suite (* error here *)
y compila da el siguiente error
Error: This expression has type Prism.state = Prism.value array but an expression was expected of type Formulas.PrismPctl.s
De lo que puedo entender que hay una especie de mal aliasing de los nombres, son los mismos (ya que value array
es el tipo definido como t
y usó M with type s = P.t
en el funtor) pero el verificador de tipos no los considera iguales.
Realmente no entiendo dónde está el problema, ¿alguien puede ayudarme?
Gracias de antemano
No sé lo suficiente sobre OCaml para ayudar, pero es posible que esta pregunta anterior es un problema similar? http://stackoverflow.com/questions/640510/functors-in-ocaml – Gian
@Gian: es el mismo problema de raíz, pero si comprende eso, ya está en camino a no necesitar hacer la pregunta en el primer lugar. – Gilles