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
>