[Haskell] Why Does This Typecheck?

Dominic Steinitz dominic.steinitz at blueyonder.co.uk
Tue Dec 21 16:52:05 EST 2004

Main> :t baz
baz :: Foo a => Char' a -> a
Main> :t v
v :: Char' BW
Main> :t test1
test1 :: Bool
Main> :t (baz v)
baz v :: Foo a => a

Why doesn't the typechecker unify Char' BW with a and therefore the type 
of test1 = baz v becomes Char' BW resulting in a type error by not being 
able to unify Char' BW with Char' Bool?


class Foo a where
    foo :: Char -> a

instance Foo Bool where
    foo 'F' = False
    foo 'T' = True

data BW = Black | White
    deriving Show

instance Foo BW where
    foo 'B' = Black
    foo 'W' = White

type Char' a = Char

baz :: Foo a => Char' a -> a
baz x = foo x

v :: Char' BW
v = 'B'

test1 :: Bool
test1 = baz v

More information about the Haskell mailing list