This code is looking better. However, [EqSet] retains the same problem: its output signature hides the equality [a = Q.item]. You really want the output signature to contain just a [type t] with no [a]. Then just use [Q.item] in place of [a] and [t] in place of [t a], everywhere in the signature.

P.S.: You can omit the line for [eq_item] at the very end, and the compiler will infer it, just as you'd expect with type classes!

On 02/10/2015 07:37 AM, Gabriel Riba wrote:
Thanks for the hint.

   type t a = list Q.item

(* --- new code: *)

functor EqSet(Q: sig con item :: Type
                      val eq_item: eq item
                  end): sig
   con t :: Type -> Type
   con a :: Type
   val empty: t a
   val singleton : a -> t a
   val insert: a -> t a -> t a
   val member: a -> t a -> bool
   val foldr: b ::: Type -> (a -> b -> b) -> b -> t a -> b
end = struct
   type a = Q.item
   type t a = list Q.item
   val empty: t a = []
   val singleton (x: a): t a = x :: []
   val member (x: a) (li: t a)  = List.exists (eq x) li
   val insert (x: a) (xs : t a) =
                  if member x xs then xs else x :: xs
   val foldr [b] (myop: a -> b -> b) (z: b) (li: t a) = List.foldr myop z li
end

structure IntEqSet = EqSet(struct type item = int
                                   val eq_item = eq_int
                            end)

_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to