如何实现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 一个作为集合的模块。
我想写一个比较集如下。
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 一个作为集合的模块。