
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 | | 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 | > | | _______________________________________________ | Haskell-Cafe mailing list | Haskell-Cafe@haskell.org | http://www.haskell.org/mailman/listinfo/haskell-cafe