2017-10-18 23 views
2

Je veux écrire un jeu similaire à celui ci-dessous.Comment obtenir la classe-type de 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 

J'ai besoin de limiter l'élément dans « un type de jeu comparables: (il y a une fonction de type: 'a * 'a -> order).

Comment y parvenir?

+0

Regardez comment la signature 'ORD_SET' de la bibliothèque SML/NJ est définie: http://www.smlnj.org/doc/smlnj-lib/Manual/ord-set.html#ORD_SET:SIG: SPEC –

+1

En outre, ce que vous voulez ne peut pas être écrit de manière sûre dans SML. J'ai écrit deux billets de blog liés à ce sujet: http://igstan.ro/posts/2017-04-08-a-safe-type-indexed-set-for-standard-ml.html et http: // igstan.ro/posts/2017-04-12-a-safe-type-indexed-set-for-standard-ml-errata.html. –

Répondre

4

Si vous voulez le faire en OCaml, cela est tout simplement un cas foncteur:

D'abord, vous devez définir le type de vos éléments:

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

Et puis vous définissez un foncteur sur ce type:

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 

ce qui est exactement ce qui est fait here.


Vous pouvez voir un foncteur en fonction du module qui permettra de créer de nouveaux modules. Ici, le foncteur ComparableSet prend un module de signature OrderedType et retourne un module qui est un ensemble.