On Fri, Jun 26, 2009 at 8:48 PM, Darryn <djreid@aapt.net.au> wrote:
                             From:
Darryn <djreid@aapt.net.au>
                               To:
beginners@haskell.org
                          Subject:
Rigid type variables match error
                             Date:
Sat, 27 Jun 2009 10:18:13 +0930


Hi, I wonder if anyone can explain what is going on here and what to do
about it. I'm fairly new to Haskell, so apologies in advance if my
question seems naive. I've cut my code down to a minimum that reproduces
the problem. I receive an error in GHCI in the following code,
complaining that it cannot match the rigid type variables for the
instance definition for Ainst for the function a3. Can anyone advise
about what to do about it?

------------------------------------------------
class A a where
   a1 :: a
   a2 :: a -> a
   a3 :: (B b) => b -> a

class B b where
   b1 :: Int -> b

data (B b) => Ainst b = I | J (Ainst b) | K b

instance (B b) => A (Ainst b) where
   a1 = I
--  a2 :: (B b, A a) => a -> a
   a2 = J
--  a3 :: (B b, A a) => b -> a
   a3 = K                 -- Error!
--  a3 = K `asTypeOf` a3   -- Error even with this!

data Binst = Val Int

instance B Binst where
   b1 = Val
------------------------------------------------

Test5.hs:17:9:
   Couldn't match expected type `b1' against inferred type `b'
     `b1' is a rigid type variable bound by
          the instance declaration at Test5.hs:12:12
     `b' is a rigid type variable bound by
         the type signature for `a3' at Test5.hs:5:13
     Expected type: b -> Ainst b1
     Inferred type: b -> Ainst b
   In the expression: K `asTypeOf` a3
   In the definition of `a3': a3 = K `asTypeOf` a3
Failed, modules loaded: none.

Thanks in advance for any help anyone can provide.

Let me rephrase your definitions slightly:
instance (B b1) => A (Ainst b1) where
   a1 = I
--  a2 :: (B b1, A a) => a -> a
   a2 = J
--  a3 :: (B b1, A a) => b -> a
   a3 = K                 -- Error!
--  a3 = K `asTypeOf` a3   -- Error even with this!

This is the way the type system sees your types.  Notice that in the type signature of a3, it has no way to know that b1 is the same as b, and worse yet, b is totally free and b1 is not (must be an instance of B), so it thinks they cannot be unified.  Which is to say, in general they may range over different types.

I would recommend removing the type class constraint from the definition of Ainst.  I haven't tried it, but I think that will make life easier for you.

Jason