Class OCaml:模块、类和;类型

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_

我在OCaml中有以下代码,生成错误“Unbound type constructor variable”:

如何声明类型“variable”

多谢各位


编辑:

谢谢你的回答,但我的问题有点难。事实上,我有两个模块和两个类“交错”。在这里,我不能在模块之前声明类“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,所以我假设您的名字是int

  • 以下内容为我编写:

    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
    
    更新

    对于新代码,打破循环最容易的地方(在我看来)是使用类
    变量
    。它的可见类型相当简单。以下内容为我编写:

    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如何知道变量集包含“variable”类型的对象,而我们使用的是“variabletype”类型?类似
    的类型是对象(类)类型。OCaml中的对象具有结构类型;i、 例如,任何具有相同类型的相同方法的对象都是相同的类型。如果您习惯于为容易混淆的对象进行命名键入。但是(IMHO)这真的很好。关于递归模块的文档应该帮助您确定如何正确实现这些模块。尽管您可能希望重新考虑设计,尽可能避免这种情况。这个例子可能更轻松一些。您需要使用和关键字在同一声明中声明两个模块。