[Haskell-cafe] Instances of constrained datatypes

Arjun Guha guhaarju at grinnell.edu
Thu Apr 7 12:15:02 EDT 2005


> One way to do roughly what you want is to pass the dictionary yourself:
>
>  >data EqDict a = EqDict {
>   >        leq :: a -> a -> Bool }
>   >
>   >data EqList a = EqList (EqDict a) [a]
>   >
>   >test :: EqList a -> EqList a -> Bool
>   >test (EqList dict (a0:as)) (EqList _ (b0:bs)) = (leq dict) a0 b0

This is like the `object-oriented approach' in John Hughes' paper.  
Let's switch to the set example in his paper:

 > data EqDict a = EqDict { isEq:: a -> a -> Bool }
 > data Set a = Set (EqDict a) [a]

So, to make it a functor, as I originally wanted:

 > instance Functor Set where
 >   fmap f (Set dict ls) = Set dict' ls' where
 >     ls' = nubBy (isEq dict') ls
 >     dict' = ???

There really isn't a way to define dict' for the resultant Set.

-Arjun


More information about the Haskell-Cafe mailing list