2017-10-18 173 views
2

我想编写一个类似的集合如下。如何实现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 * 'a -> order)。

如何实现它?

+0

看看如何定义SML/NJ库中的ORD_SET签名:http://www.smlnj.org/doc/smlnj-lib/Manual/ord-set.html#ORD_SET:SIG: SPEC –

+1

另外,您想要的内容不能以SML中的安全方式书写。我撰写了两篇与此主题相关的博文:http://igstan.ro/posts/2017-04-08-a-safe-type-in​​dexed-set-for-standard-ml.html和http:// igstan.ro/posts/2017-04-12-a-safe-type-in​​dexed-set-for-standard-ml-errata.html。 –

回答

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的模块并返回一个模块,该模块是一个集合。