Tôi tò mò muốn hiểu tại sao lỗi này xảy ra và đó là cách tốt nhất để giải quyết nó.Lỗi: Không thể đánh giá một cách an toàn định nghĩa của mô đun được xác định đệ quy
Tôi có một vài tệp types.ml
và types.mli
xác định loại biến thể value
có thể có nhiều loại OCaml khác nhau (float, int, list, map, set, v.v ..).
Vì tôi phải sử dụng std-lib trên loại biến thể này, tôi cần phải cụ thể hóa mô-đun Set thông qua functor để có thể sử dụng bộ loại value
bằng cách xác định mô-đun ValueSet
.
Các thức .ml
tập tin là một cái gì đó như:
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)
Như bạn có thể thấy tôi đã phải xác định các mô-đun ValueSet
từ functor để có thể sử dụng kiểu dữ liệu đó. Vấn đề xảy ra khi tôi muốn sử dụng mô-đun đó bên trong tờ khai của I
. Để tôi có được lỗi sau:
Error: Cannot safely evaluate the definition of the recursively-defined module I
Tại sao điều này xảy ra? Đó là cách tốt để giải quyết nó? Và chỉ cần biết, là cách tiếp cận của tôi với những gì tôi đang cố gắng làm đúng? Bên cạnh đó nó hoạt động như dự định (tôi có thể sử dụng loại ValueSet với các hoạt động của tôi trong các mô-đun khác, nhưng tôi phải bình luận dòng liên quan trong types.ml
để vượt qua giai đoạn biên dịch).
tôi đã cố gắng để loại bỏ tất cả các mã không cần thiết và giảm mã để cần thiết cần thiết để điều tra lỗi này .. nếu nó không enought chỉ cần hỏi :)
EDIT: theo OCaml tham khảo chúng tôi có mà
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.
Đây là tất cả những gì tôi tìm thấy cho đến nay, nhưng tôi không nhận được ý nghĩa chính xác ..
Thank trước
có, đó là một sai lầm trong khi giảm (đó là một 'loại ... và giá trị =' nhưng tôi loại bỏ các loại khác). Trên thực tế không có sự khác biệt khác, chỉ cần kiểm tra, vì vậy tôi thực sự không biết những gì có thể gây ra lỗi đó. Tôi sẽ kiểm tra nó tốt hơn và cho bạn biết, cảm ơn trong khi đó. – Jack
Ok, tôi đã thử mã đầy đủ của 'types.ml' bên trong toplevel và nó không hoạt động, cho cùng một lỗi' Lỗi: Không thể đánh giá một cách an toàn định nghĩa của mô-đun đệ quy xác định I' .. đó là ngớ ngẩn. Trong khi bạn làm giảm phiên bản làm việc, nhưng nếu tôi bình luận chỉ là dòng đó cũng công trình của tôi .. – Jack
Điều này rất có thể là một vấn đề Gilles định nghĩa; đảm bảo rằng mô-đun được an toàn bằng cách chuyển đổi bất kỳ giá trị không đổi nào thành các hàm đơn vị. – nlucaroni