instance declaration troubles

Hal Daume III hdaume@ISI.EDU
Fri, 7 Mar 2003 07:08:06 -0800 (PST)


Double Argh!  I just noticed that this isn't what I meant to quote and now
I can't find it.  But the basic idea of what I wanted to quote was that:

YOu have to have at least one non-type variable in instance declarations
otherwise we don't necessarily know that reduction will terminate.  I.e.:

  instance A a => B a where
  instance B a => A a where

will not terminate if you ever try to reduce A to B.  I recall from the
docs that Simon is "looking for a rule which lifts this rule but still
maintains decidability."  or something along those lines.

Sorry about that!

 - Hal

--
 Hal Daume III                                   | hdaume@isi.edu
 "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume

On Fri, 7 Mar 2003, Simon Peyton-Jones wrote:

> Argh. The documentation is out of date, or rather, inconsistent.
> 
> In Section 7.3.4 you'll see that GHC -fglasgow-exts lifts the
> restriction that class methods must not constrain only the class type
> variable.
> 
> I'll fix 7.3.5.2, which you are quoting.
> 
> Simon
> 
> | -----Original Message-----
> | From: Hal Daume III [mailto:hdaume@ISI.EDU]
> | Sent: 07 March 2003 03:16
> | To: Nick Name
> | Cc: haskell-cafe@haskell.org
> | Subject: Re: instance declaration troubles
> | 
> | 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                                   | hdaume@isi.edu
> |  "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume
> | 
> | 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
> | > Haskell-Cafe@haskell.org
> | > http://www.haskell.org/mailman/listinfo/haskell-cafe
> | >
> | 
> | _______________________________________________
> | Haskell-Cafe mailing list
> | Haskell-Cafe@haskell.org
> | http://www.haskell.org/mailman/listinfo/haskell-cafe
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>