Ich implementiere Sets in Standard ML. Derzeit sieht es wie folgt aus:SML Allgemeiner Typ für verschiedene Strukturen
signature SET = sig
type t
type 'a set
...
val map : ('a -> t) -> 'a set -> t set
end
functor ListSetFn (EQ : sig type t val equal : t * t -> bool end)
:> SET where type t = EQ.t = struct
type t = EQ.t
type 'a set = 'a list
...
fun map f = fromList o (List.map f)
end
Ich möchte die map
Funktion SET
jeden Satz in einer Struktur zu ergreifen, um der Lage sein, im Idealfall nicht einmal auf jene eingeschränkt von ListSetFn
Funktors. Doch auf der obersten Ebene kann es nur auf Gruppen arbeiten, indem sie eine einzige Struktur geschaffen: Einer es aus aufgerufen wird, zB:
functor EqListSetFn(eqtype t) :> SET where type t = t = struct
structure T = ListSetFn(struct type t = t val equal = op= end)
open T
end
structure IntSet = EqListSetFn(type t = int)
IntSet.map : ('a -> IntSet.t) -> 'a IntSet.set -> IntSet.t IntSet.set
Während ich wirklich möchte es so etwas wie
IntSet.map : ('a -> IntSet.t) -> 'a ArbitrarySet.set -> IntSet.t IntSet.set
sein
Gibt es eine Möglichkeit, es zu tun? Ich weiß, dass es auf der obersten Ebene erklärt werden könnte, aber ich möchte die interne Implementierung verstecken und damit undurchsichtig Signatur verwenden (s)