我在OCaml中有以下代码,它产生错误“Unbound type constructor variable”:
module OrderedVar = struct
type t = variable
let compare v1 v2 = v1#get_name - v2#get_name
end
module VarSet = Set.Make(OrderedVar)
class variable n =
object
val mutable name = n
method get_name = name
end
如何声明类型“变量”?
谢谢
编辑:
谢谢你的答案,但我的问题有点困难。事实上,我有两个模块和两个“隔行扫描”的类。在这里,我不能在模块之前声明类“variable”和“clause”,因为它们需要模块:
module OrderedVar = struct
type t = variable
let compare v1 v2 = v1#get_name - v2#get_name
end
module VarSet = Set.Make(OrderedVar)
module OrderedClause = struct
type t = clause
let compare = compare
end
module ClauseSet = Set.Make(OrderedClause)
class variable n =
object
val mutable name = n
val mutable cpos = ClauseSet.empty
method get_name = name
end
class clause =
object
val mutable vpos = VarSet.empty
end
答案 0 :(得分:0)
两条评论:
这主要是订购问题。
-
运算符适用于整数,所以我假设你的名字是整数?
以下编译:
class variable n =
object
val mutable name: int = n
method get_name = name
end
module OrderedVar = struct
type t = variable
let compare v1 v2 = v1#get_name - v2#get_name
end
module VarSet = Set.Make(OrderedVar)
<强>更新强>
对于新代码,打破循环的最简单的地方(在我看来)是使用类variable
。它的可见类型相当简单。以下内容为我编译:
type variabletype = < get_name : int >
module OrderedVar = struct
type t = variabletype
let compare v1 v2 = v1#get_name - v2#get_name
end
module VarSet = Set.Make(OrderedVar)
class clause =
object
val mutable vpos = VarSet.empty
end
module OrderedClause = struct
type t = clause
let compare = compare
end
module ClauseSet = Set.Make(OrderedClause)
class variable n =
object
val mutable name: int = n
val mutable cpos = ClauseSet.empty
method get_name = name
end
也许这会对你的实际问题一概而论。
答案 1 :(得分:0)
在使用变量类之前声明它。与典型的基于C的OO语言不同,顺序在Ocaml中很重要,其中类和方法可以出现在文件中的任何位置。
此引用来自https://realworldocaml.org/v1/en/html/files-modules-and-programs.html
与C不同,OCaml中的程序没有唯一的主要功能。在评估OCaml程序时,将按照它们链接在一起的顺序评估实现文件中的所有语句。