
Brandon S. Allbery KF8NH wrote:
I can't tell where I'm making the mistake here.
In Just 3 >>= (+1), we have, with some alpha conversions to make the unification easier to follow: Just 3 :: Num i => Maybe i -- (1) (>>=) :: m a -> (a -> m b) -> m b -- (2) (+1) :: Num n => n -> n -- (3) Unify (1) with the first argument in (2): Maybe i ~ m a m ~ Maybe -- (4) i ~ a -- (5) Unify the second argument in (2) with (3): (n -> n) ~ (a -> m b) n ~ a -- (6) n ~ m b -- (7) Substitute (4) in (7): n ~ Maybe b -- (8) But we have (Num n), so from (8), we need (Num (Maybe b)). Since there is no such instance, we get the error. Your question seems to be whether some other error should have come up first.
From (5) and (6), we get:
n ~ i -- (9) And from (8): i ~ Maybe b -- (10) Again, we have (Num i), so from (10), we need (Num (Maybe b)). Same error, different route. Perhaps you are assuming that i defaults to Integer before the type-checking completes, and are therefore expecting that (10) should produce a unification error before contexts are checked? Regards, Matthew