【问题标题】:OCaml : module, class & typeOCaml:模块、类和类型
【发布时间】:2014-03-01 01:08:56
【问题描述】:

我在 OCaml 中有以下代码会产生错误“未绑定类型构造函数变量”:

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

如何声明类型“变量”?

谢谢


编辑:

感谢您的回答,但我的问题有点困难。事实上,我有两个模块和两个“交错”的类。在这里,我不能在模块之前声明类“变量”和“子句”,因为它们需要模块:

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

【问题讨论】:

标签: class object types module ocaml


【解决方案1】:

两个cmets:

  1. 大多数情况下这只是一个排序问题。

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

以下为我编译:

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

也许这会将 OK 概括为您的实际问题。

【讨论】:

  • 我的代码过于简化了。我在第一篇文章中添加了一个新代码,我认为我无法将您的解决方案应用于它
  • 没错,你有一个循环依赖。您可以定义相互递归的模块,并且模块可以包含类。但是语法会变得很重。
  • 如何让两个模块相互递归?我可以使用“and”(我们用于相互递归函数)吗?
  • 是的,它有效!但我不确定我是否理解您是如何做到这一点的: 的含义是什么以及 ocaml 如何知道 VarSet 包含“变量”类型的对象而我们使用的是“变量类型”类型?
  • &lt; method : mtype&gt; 这样的类型是对象(类)类型。 OCaml 中的对象具有结构类型;也就是说,任何具有相同方法和相同类型的东西都是相同的类型。如果您习惯于对可能令人困惑的对象进行标称输入。但是(恕我直言)真的很好。
【解决方案2】:

在使用之前声明变量类。顺序在 Ocaml 中很重要,不像典型的基于 C 的 OO 语言,类和方法可以出现在文件中的任何位置。

此引用来自https://realworldocaml.org/v1/en/html/files-modules-and-programs.html

与 C 不同,OCaml 中的程序没有唯一的 main 函数。在评估 OCaml 程序时,实现文件中的所有语句都按照它们链接在一起的顺序进行评估。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2018-06-03
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多