Thanks, I think I was just confused... (and other types elsewhere may have been interfearing)... there still seems
something not quite right...


If I add the following definiton to the test code:

   instance Test (a -> m b) (m b) where
       test _ _ = "Third"

then I add the following print:

print $ test (\_ -> [True]) [True]

it says no instance for (t -> [Bool), but if I add a type annotation all is Okay:

print $ test ((\_ -> [True]) :: () -> [Bool]) [True]

Is this expected behavior? Finally, If I change the definition to:

   instance Test (a -> m b) z where
       test _ _ = "Third"

it now complains about it overlapping with both of the other definitions... Why does this overlap?

   Regards,
   Keean.




Simon Peyton-Jones wrote:


| I have been doing some work recently which involves classes with
| overlapping instances... for example
| | class Test x y where
| test :: x -> y
| | instance Test (a b) (c b) where
| test =
| | instance Test (a b) (a b) where
| test =
| | This gives an overlapping instance error - which cannot be avoided
with
| -fallow-overlapping-instances.
| However - it is fairly obvious that the first case 'a' cannot be
unified
| with 'c' or it would be a type error, therefore
| the cases do not overlap... Is this a bug in ghc, is it easily fixable
-
| or am I confused?


You are right.  They don't overlap.  The program below runs fine with
GHC 6.0.1, and prints

cam-02-unx:~/tmp$ ghc -fallow-overlapping-instances -fglasgow-exts
Foo.hs
cam-02-unx:~/tmp$ ./a.out
"Second"
"First"

Simon

=========================
module Main where

class Test x y where
   test :: x -> y -> String

instance Test (a b) (c b) where test x y = "First"

instance Test (a b) (a b) where
 test x y = "Second"

main = do { print (test [True] [True]) ;
            print (test [True] (Just True)) }









_______________________________________________ Glasgow-haskell-users mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to