instance declaration troubles

Simon Peyton-Jones simonpj@microsoft.com
Fri, 7 Mar 2003 16:13:14 -0000


It's in 7.3.5.3.  I'm going to make it more prominent

S

| -----Original Message-----
| From: Hal Daume III [mailto:hdaume@ISI.EDU]
| Sent: 07 March 2003 15:08
| To: Nick Name
| Cc: Haskell Cafe
| Subject: RE: instance declaration troubles
|=20
| 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:
|=20
| 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.:
|=20
|   instance A a =3D> B a where
|   instance B a =3D> A a where
|=20
| 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.
|=20
| Sorry about that!
|=20
|  - Hal
|=20
| --
|  Hal Daume III                                   | hdaume@isi.edu
|  "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume
|=20
| On Fri, 7 Mar 2003, Simon Peyton-Jones wrote:
|=20
| > 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 =3D> (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 =3D> (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 =3D> 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) =3D> Functor a where
| > | >     fmap f x =3D mk (ls x >>=3D 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
| >
|=20
| _______________________________________________
| Haskell-Cafe mailing list
| Haskell-Cafe@haskell.org
| http://www.haskell.org/mailman/listinfo/haskell-cafe