如何实现sml的类型类?

时间:2017-10-18 10:31:00

标签: ocaml sml ml

我想写一个类似的集合如下。

signature COMPARABLE_SET=
sig
  type 'a set
  val empty: 'a set
  val insert: 'a * 'a set -> 'a set
  val member: 'a * 'a set -> bool
end

我需要将一个集合类型中的元素限制为可比较:(有一个类型为'a * 'a -> order的函数)。

如何实现它?

1 个答案:

答案 0 :(得分:4)

如果你想在OCaml中这样做,这只是一个仿函数案例:

首先,您需要定义元素的类型:

module type OrderedType = sig 
  type t 
  val compare : t -> t -> int
end

然后你将在这种类型上定义一个仿函数:

module MakeComparableSet (Ord : OrderedType) :
  sig
    type elt = Ord.t
    type t
    val empty : t
    val insert : elt -> t -> t
    val member : elt -> t -> bool
  end = struct
    type elt = Ord.t
    type t
    let empty = failwith "TODO"
    let insert = failwith "TODO"
    let member = failwith "TODO"
  end

究竟是什么here

您可以将仿函数视为将创建新模块的模块的函数。这里,仿函数ComparableSet采用签名OrderedType的模块并返回一个集合的模块。