module - OCaml:设置模块

标签 module set ocaml

我想使用 OCaml 生成数据集并在它们之间进行比较。我看过模块类型的文档,如 Set.OrderType , Set.Make等,但我不知道如何初始化集合或以其他方式使用它们。

最佳答案

集合是使用函数接口(interface)定义的。对于任何给定的类型,您必须创建一个 Set该类型的模块使用 Set.Make仿函数。对标准库的一个不幸的疏忽是它们没有定义 Set。内置类型的实例。在最简单的情况下,使用 Pervasives.compare 就足够了.这是一个适用于 int 的定义:

module IntSet = Set.Make( 
  struct
    let compare = Pervasives.compare
    type t = int
  end )

模块IntSet将实现 Set.S界面。现在您可以使用 IntSet 对集合进行操作。模块:
let s = IntSet.empty ;;
let t = IntSet.add 1 s ;;
let u = IntSet.add 2 s ;;
let tu = IntSet.union t u ;;

请注意,您不必显式定义 Set.Make 的输入结构。作为 OrderedType ;类型推断将为您完成工作。或者,您可以使用以下定义:
module IntOrder : Set.OrderedType = struct
  type t = int
  let compare = Pervasives.compare
end

module IntSet = Set.Make( IntOrder )

这样做的好处是您可以重复使用相同的模块来实例化 Map :
module IntMap = Map.Make( IntOrder )

你在使用仿函数时失去了一些通用性,因为元素的类型是固定的。例如,您将无法定义一个接受 Set 的函数。某种任意类型并对其执行一些操作。 (幸运的是,Set 模块本身在 Set 上声明了许多有用的操作。)

关于module - OCaml:设置模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1452218/

相关文章:

syntax - 访问、实例化和声明模块之间有什么区别?

ruby - 集合 vs 数组,区别

python - 这行Python代码是什么意思?

android - 以编程方式设置Android设备的锁屏壁纸

regex - 排除 OCaml RegEx 中的特定单词

ocaml - 如何使用 OCaml/Reason 在模块中创建内部值(value)

unix - OCaml:标准输入重定向时 Unix.getlogin 出现意外异常

types - ocaml 中的模块化编程

python - 在 Python 中,我可以调用导入模块的 main() 吗?

Firefox Quantum ESR PKCS11 - 如何通过脚本或配置设置加载