Class OCaml:模块、类和;类型
我在OCaml中有以下代码,生成错误“Unbound type constructor variable”: 如何声明类型“variable” 多谢各位Class OCaml:模块、类和;类型,class,object,types,module,ocaml,Class,Object,Types,Module,Ocaml,我在OCaml中有以下代码,生成错误“Unbound type constructor variable”: 如何声明类型“variable” 多谢各位 编辑: 谢谢你的回答,但我的问题有点难。事实上,我有两个模块和两个类“交错”。在这里,我不能在模块之前声明类“variable”和“clause”,因为它们需要模块: module OrderedVar = struct type t = variable let compare v1 v2 = v1#get_name - v2#get_
编辑: 谢谢你的回答,但我的问题有点难。事实上,我有两个模块和两个类“交错”。在这里,我不能在模块之前声明类“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
两点意见:
-
运算符适用于int,所以我假设您的名字是intclass 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)
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
更新
对于新代码,打破循环最容易的地方(在我看来)是使用类变量
。它的可见类型相当简单。以下内容为我编写:
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)
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
type variabletype=
模块OrderedVar=struct
类型t=可变类型
让我们比较一下v1 v2=v1#get#u name-v2#get#u name
结束
模块VarSet=Set.Make(OrderedVar)
类别子句=
对象
val可变vpos=VarSet.empty
结束
模块OrderedClause=struct
类型t=子句
让我们比较一下
结束
模块ClauseSet=Set.Make(OrderedClause)
类变量n=
对象
val可变名称:int=n
val可变cpos=ClauseSet.empty
方法get_name=name
结束
也许这会将OK推广到您的实际问题。在使用变量类之前声明它。顺序在Ocaml中很重要,这与典型的基于C的OO语言不同,在这种语言中,类和方法可以出现在文件中的任何位置 这句话出自
与C不同,OCaml中的程序没有唯一的主函数。当计算OCaml程序时,实现文件中的所有语句都将按照它们链接在一起的顺序进行计算 我把代码简化得太多了。我在我的第一篇文章中添加了一个新代码,我想我不能将您的解决方案应用于它,因为您有一个循环依赖关系。您可以定义相互递归的模块,并且模块可以包含类。但是语法会变得非常繁重。我怎样才能使两个模块相互递归呢?我可以使用“and”(我们用于相互递归函数)吗?是的,它可以工作!但是我不确定我是否理解您是如何做到这一点的:
的类型是对象(类)类型。OCaml中的对象具有结构类型;i、 例如,任何具有相同类型的相同方法的对象都是相同的类型。如果您习惯于为容易混淆的对象进行命名键入。但是(IMHO)这真的很好。关于递归模块的文档应该帮助您确定如何正确实现这些模块。尽管您可能希望重新考虑设计,尽可能避免这种情况。这个例子可能更轻松一些。您需要使用和关键字在同一声明中声明两个模块。