instance declaration troubles

Hal Daume III hdaume@ISI.EDU
Thu, 6 Mar 2003 19:15:48 -0800 (PST)

>From the GHC docs:

In the signature of a class operation, every constraint must mention at
least one type variable that is not a class type variable. Thus:

  class Collection c a where
    mapC :: Collection c b => (a->b) -> c a -> c b

is OK because the constraint (Collection a b) mentions b, even though it
also mentions the class variable a. On the other hand:

  class C a where
    op :: Eq a => (a,b) -> (a,b)

is not OK because the constraint (Eq a) mentions on the class type
variable a, but not b. However, any such example is easily fixed by moving
the offending context up to the superclass context:

  class Eq a => C a where
    op ::(a,b) -> (a,b)

A yet more relaxed rule would allow the context of a class-op signature to
mention only class type variables. However, that conflicts with Rule
1(b) for types above.

 Hal Daume III                                   |
 "Arrest this man, he talks in maths."           |

On Fri, 7 Mar 2003, Nick Name wrote:

> I want to declare the following:
> class Get a where
>     ls :: a b -> IO [b]
>     mk :: IO [b] -> a b
> instance (Get a) => Functor a where
>     fmap f x = mk (ls x >>= return . map f)
> But to have ghc type everything, I have to turn on "-fglasgow-exts
> -fallow-undecidable-instances -fallow-overlapping-instances".
> Is there a clean way to state that all types in my type class are also
> in the "Functor" type class? 
> If not, what is the problem?
> Vincenzo
> _______________________________________________
> Haskell-Cafe mailing list