2017-10-18 25 views
2

Ich möchte ein vergleichbares Set wie folgt schreiben.Wie erreicht man die Klasse von 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 

Ich brauche das Element in ‚einem Mengentyp zu begrenzen vergleichbar zu sein: (es gibt eine Funktion mit Typ ist: 'a * 'a -> order).

Wie erreichen?

+0

Schauen Sie sich an, wie die 'ORD_SET'-Signatur aus der SML/NJ-Bibliothek definiert ist: http://www.smnnj.org/doc/smlnj-lib/Manual/ord-set.html#ORD_SET:SIG: SPEC –

+1

Auch was Sie wollen, kann in SML nicht sicher geschrieben werden. Ich habe zwei Blogposts zu diesem Thema geschrieben: http://igstan.ro/posts/2017-04-08-a-safe-type-indexed-set-for-standard-ml.html und http: // igstan.ro/posts/2017-04-12-a-safe-type-indexed-set-for-standard-ml-errata.html. –

Antwort

4

Wenn Sie es in OCaml tun wollen, ist dies einfach ein Funktor Fall:

Zuerst müssen Sie die Art Ihrer Elemente definieren:

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

Und dann werden Sie definieren Funktors auf diese Art:

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 

das ist genau das, was here gemacht wird.


Sie können einen Funktor als eine Funktion auf dem Modul sehen, die neue Module erstellen wird. Hier nimmt der Functor ComparableSet ein Modul der Signatur OrderedType und gibt ein Modul zurück, das eine Menge ist.

Verwandte Themen