Tôi khá khó khăn với vấn đề functor sau trong OCaml. Tôi dán một số mã chỉ để cho bạn hiểu. Về cơ bảnTìm hiểu về các thư viện trong OCaml
tôi xác định hai mô-đun trong 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
và functor sau:
module Make(P: ProbPA): (M with type s = P.t) = struct
type s = P.t
(* implementation *)
end
Sau đó, để thực sự sử dụng các mô-đun tôi xác định một mô-đun mới trực tiếp trong một tập tin gọi là 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 *)
Từ nguồn thứ ba (formulas.ml
) tôi đã sử dụng functor với Prism
mô-đun:
module PrismPctl = Pctl.Make(Prism)
open PrismPctl
Và cuối cùng từ main.ml
open Formulas.PrismPctl
(* code to prepare the object *)
PrismPctl.check_suite s.sys_state suite (* error here *)
và biên dịch cung cấp cho các lỗi sau
Error: This expression has type Prism.state = Prism.value array but an expression was expected of type Formulas.PrismPctl.s
Từ những gì tôi có thể hiểu được có một loại bí danh xấu của các tên, chúng giống nhau (vì value array
là loại được định nghĩa là t
và nó 's được sử dụng M with type s = P.t
trong functor) nhưng kiểm tra loại không xem xét chúng giống nhau.
Tôi thực sự không hiểu vấn đề ở đâu, ai cũng có thể giúp tôi?
Cảm ơn trước
Tôi không biết đủ về OCaml để giúp đỡ, nhưng nó có thể là câu hỏi trước đây là một vấn đề tương tự? http://stackoverflow.com/questions/640510/functors-in-ocaml – Gian
@Gian: đó là cùng một vấn đề gốc, nhưng nếu bạn hiểu điều đó, bạn đã sẵn sàng trên con đường của bạn để không cần phải đặt câu hỏi trong địa điểm đầu tiên. – Gilles