
Your Map' (==) is lying! :) Your definition purports to establish an equivalence class for all MP (key,value) with the same key, but MP(key,1) and MP(key,2) are not "equivalent" in any meaningful way outside the internals of Map' (else you could dispense with the payload entirely!) Set is now not a representation of Map', but a co-representation. Details are exposed to outsiders to hide them from Map'. Everyone else pays so that Map' 's life is a little easier. Contrast that with, say, a set represented by a list, with compare defined to sort before comparing. This is a meaningful (to outsiders) equivalence relation because it hides the internal representation artifact that lists have a (spurious) ordering. IMHO the interface should represent the external properties, not some internal invariant. In short, Map' doesn't say what it mean and mean what it says. If you told me for a, b :: MyPair k v that a == b, I would (foolishly) expect that a = b. I suspect that I wouldn't be the only one to make that mistake. Dan Weston Tony Morris wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
...it seems to be a special case of Set? Does Data.Map add anything more useful than Map' below?
import Data.Set as Set
newtype MyPair a b = MP (a, b) deriving Show
instance (Eq a) => Eq (MyPair a b) where MP (a, _) == MP (a', _) = a == a'
instance (Ord a) => Ord (MyPair a b) where MP (a, _) `compare` MP(a', _) = a `compare` a'
type Map' k a = Set (MyPair k a)
- -- Tony Morris http://tmorris.net/
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFGnDgEmnpgrYe6r60RAu4FAJ93Fwcx7ZX08+qO4ZlzRVV52TXpNQCeNr7u ioq0XrWt/Wymfh52W1spiFk= =FC5h -----END PGP SIGNATURE----- _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe