Tengo curiosidad por comprender por qué ocurre este error y cuál es la mejor manera de evitarlo.Error: No se puede evaluar con seguridad la definición del módulo de definición recursiva
que tienen un par de archivos types.ml
y types.mli
que definen una variante de tipo value
que pueden ser de muchos diferentes tipos internos OCaml (float, int, lista, mapa, sistema, etc ..).
Como tengo que usar el std-lib sobre este tipo de variante, necesitaba concretar el módulo Set a través del functor para poder usar conjuntos del tipo value
definiendo el módulo ValueSet
.
El archivo final .ml
es algo así como:
module rec I :
sig
type value =
Nil
| Int of int
| Float of float
| Complex of Complex.t
| String of string
| List of (value list) ref
| Array of value array
| Map of (value, value) Hashtbl.t
| Set of ValueSet.t ref
| Stack of value Stack.t
...
type t = value
val compare : t -> t -> int
end
= struct
(* same variant type *)
and string_value v =
match v with
(* other cases *)
| Set l -> sprintf "{%s} : set" (ValueSet.fold (fun i v -> v^(string_value i)^" ") !l "")
end
and OrderedValue :
sig
type t = I.value
val compare : t -> t -> int
end
= struct
type t = I.value
let compare = Pervasives.compare
end
and ValueSet : Set.S with type elt = I.value = Set.Make(I)
Como se puede ver tuviera que definir el módulo ValueSet
del funtor que ser capaz de utilizar ese tipo de datos. El problema ocurre cuando quiero usar ese módulo dentro de la declaración de I
. Para que obtenga el siguiente error:
Error: Cannot safely evaluate the definition of the recursively-defined module I
¿Por qué sucede esto? ¿Cuál es una buena manera de resolverlo? Y solo para saber, ¿mi enfoque de lo que trato de hacer es correcto? Aparte de eso, funciona según lo previsto (puedo usar el tipo ValueSet con mis operaciones en otros módulos, pero tengo que comentar la línea implicada en types.ml
para pasar la fase de compilación).
Me trataron de eliminar todo el código superfluos y reducir el código para necesaria esencial investigar este error .. si no es enought simplemente pregunta :)
EDIT: de acuerdo con la referencia OCaml tenemos que
Currently, the compiler requires that all dependency cycles between the recursively-defined module identifiers go through at least one “safe” module. A module is “safe” if all value definitions that it contains have function types typexpr1 -> typexpr2.
Esto es todo lo que he encontrado hasta ahora, pero no consigo el significado exacto ..
Gracias de antemano
sí, fue un error al reducir (era un 'tipo ... y valor =' pero eliminé otros tipos). En realidad, no hay otras diferencias, simplemente comprobadas, así que realmente no sé qué puede estar causando ese error. Lo revisaré mejor y le haré saber, gracias mientras tanto. – Jack
Ok, probé el código completo de 'types.ml' dentro del toplevel y no funciona, dando el mismo error' Error: No se puede evaluar con seguridad la definición del módulo I recursivamente definido. Eso es una tontería. Mientras que la versión reducida funciona, pero si comento exactamente esa línea, también funciona la mía. – Jack
Probablemente este sea un problema que Gilles define; asegúrese de que el módulo esté seguro convirtiendo cualquier valor constante en funciones de la unidad. – nlucaroni