[Haskell-cafe] Subtypes and Co/Contra-variance
Ashley Yakeley
ashley at semantic.org
Fri Jan 11 04:56:59 EST 2008
Consider this:
type Super = forall a. [a]
type Sub = forall b. b
cast0 :: Sub -> Super
cast0 s = s
cast1a :: forall p. (Super -> p) -> (Sub -> p)
cast1a sp x = sp x
cast1b :: forall p. (Super -> p) -> (Sub -> p)
cast1b sp = sp
This compiles except for cast1b (ghc -c -fglasgow-exts):
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `cast1b'
I get a similar result when I try a different Super and Sub:
type Super = (?x :: Bool) => Int
type Sub = Int
Couldn't match expected type `Sub' against inferred type `Super'
When matching `(?x::Bool) => Int'
and `Int'
Expected type: Sub -> p
Inferred type: Super -> p
In the expression: sp
In either case, if cast1a compiles, shouldn't cast1b compile?
--
Ashley Yakeley
More information about the Haskell-Cafe
mailing list