我想使用 OCaml 生成数据集并在它们之间进行比较。我看过模块类型的文档,例如Set.OrderType
, Set.Make
等等,但我不知道如何初始化一组或以其他方式使用它们。
集合是使用函数接口定义的。对于任何给定的类型,您必须创建一个Set
该类型的模块使用Set.Make
函子。标准库的一个不幸的监督是它们没有定义Set
内置类型的实例。在大多数简单的情况下,使用就足够了Pervasives.compare
。这是一个适用于的定义int
:
module IntSet = Set.Make(
struct
let compare = Pervasives.compare
type t = int
end )
该模块IntSet
将实施Set.S
界面。现在您可以使用以下命令对集合进行操作IntSet
module:
let s = IntSet.empty ;;
let t = IntSet.add 1 s ;;
let u = IntSet.add 2 s ;;
let tu = IntSet.union t u ;;
请注意,您不必显式定义输入结构Set.Make
as an 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
s.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)