OCaml:模块,类和&类型

时间:2014-02-04 20:49:12

标签: class object types module ocaml

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

2 个答案:

答案 0 :(得分:0)

两条评论:

  1. 这主要是订购问题。

  2. -运算符适用于整数,所以我假设你的名字是整数?

  3. 以下编译:

    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程序时,将按照它们链接在一起的顺序评估实现文件中的所有语句。