如何实现sml的type-class?

How to achieve the type-class of sml?

我想写一个比较集如下。

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 set 类型中的元素是可比较的:(有一个函数类型为:'a * 'a -> order).

如何实现?

如果你想在 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 的模块和 returns 一个作为集合的模块。