2017-10-18 19 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 

Iは匹敵するセットタイプ」の要素を限定する必要があります(タイプの関数がある:'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で安全な方法で書くことはできません。私はこのトピックに関連する2つのブログ記事を書いた: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 

そして、あなたが定義します:

まず、あなたの要素の型を定義する必要がありますこのタイプのファンクタ:here作られるまさにある

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 


新しいモジュールを作成するモジュールでは、関数としてファンクタが表示されます。ここで、ファンクタComparableSetは、署名OrderedTypeのモジュールを取り、セットであるモジュールを返します。

関連する問題