J'implémente des ensembles dans la norme ML. Actuellement, il ressemble à ceci:SML Type commun pour différentes structures
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
Je veux la fonction map
pour pouvoir prendre un ensemble dans une structure SET
, idéalement même pas contraint à ceux de foncteur ListSetFn
. Cependant, au niveau supérieur, il ne peut fonctionner que sur des ensembles créés par une structure unique: celui qu'il est appelé à partir, par exemple:
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
Pendant que je voudrais vraiment à quelque chose comme
IntSet.map : ('a -> IntSet.t) -> 'a ArbitrarySet.set -> IntSet.t IntSet.set
Y a-t-il un moyen de le faire? Je sais que ce pourrait être déclaré au niveau supérieur, mais je veux cacher la mise en œuvre interne et utiliser donc la signature opaque (s)