gpt4 book ai didi

module - 理解 OCaml 中的仿函数

转载 作者:行者123 更新时间:2023-12-04 07:45:27 24 4
gpt4 key购买 nike

我对 OCaml 中的以下仿函数问题非常困扰。我粘贴一些代码只是为了让您理解。基本上

我在 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

和以下仿函数:
module Make(P: ProbPA): (M with type s = P.t) = struct
type s = P.t
(* implementation *)
end

然后为了实际使用这些模块,我直接在一个名为 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 *)

从第三个来源( formulas.ml )我使用仿函数和 Prism模块:
module PrismPctl = Pctl.Make(Prism)
open PrismPctl

最后来自 main.ml
open Formulas.PrismPctl
(* code to prepare the object *)
PrismPctl.check_suite s.sys_state suite (* error here *)

并编译给出以下错误

Error: This expression has type Prism.state = Prism.value array but an expression was expected of type Formulas.PrismPctl.s



据我所知,名称有一种不好的别名,它们是相同的(因为 value array 是定义为 t 的类型,并且在仿函数中使用了 M with type s = P.t)但类型检查器不考虑他们一样。

我真的不明白问题出在哪里,有人可以帮助我吗?

提前致谢

最佳答案

(您发布了不可编译的代码。这是一个坏主意,因为它可能会使人们更难帮助您,并且因为将您的问题简化为一个简单的示例有时足以解决它。但我想我还是看到了您的困难。 )

内部 formulas.ml , Ocaml 可以看到 PrismPctl.s = Pctl.Make(Prism).t = Prism.t ;第一个等式来自 PrismPctl 的定义,第二个等式来自 Pctl.Make 的签名(特别是 with type s = P.t 位)。

如果你不写 mli Formulas 的文件,您的代码应该可以编译。所以问题一定是.mli你写的文件没有提到正确的平等。你不显示你的.mli文件(你应该,它们是问题的一部分),但大概你写了

module PrismPctl : Pctl.M

这还不够:当编译器编译 main.ml , 它不会知道 PrismPctl formulas.mli 中未指定.您需要指定
module PrismPctl : Pctl.M with type s = Prism.t

或者,假设您包括 with type s = P.tMake的签名中在 pctl.mli
module PrismPctl : Pctl.M with type s = Pctl.Make(Prism).s

关于module - 理解 OCaml 中的仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3327586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com