1
我實現套標ML。目前,它看起來像這樣:SML普通型的不同結構
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
我想map
功能能夠採取任何一組在結構SET
,理想方式甚至不限制於那些從ListSetFn
仿函數。然而,在頂層它只能由單一結構創建集進行操作:一個是從所謂的,如:
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
雖然我真的很喜歡它是像
IntSet.map : ('a -> IntSet.t) -> 'a ArbitrarySet.set -> IntSet.t IntSet.set
有沒有辦法做到這一點?我知道它可以在頂級聲明,但我想隱藏的內部實現,因此使用不透明簽名(S)