Left-to-right bias in type checking GADT functions
Stefan Holdermans
stefan at cs.uu.nl
Tue Jun 20 03:52:56 EDT 2006
Hi all,
I have to admit that I haven't checked if this is a known issue...
The following is tested with both GHC 6.4.1 and 6.4.2; I have not
checked the HEAD.
Let me define a simple GADT |F|,
-- a simple GADT
data F :: * -> * where F :: Int -> F ()
and a more or less trivial function |g| operating on it:
-- type checks
g :: F a -> a -> Int
g (F n) () = n
No problems up to here. But then let me just flip the parameters of |
g|---and call the resulting function |h|:
-- does not type check
h :: a -> F a -> Int
h () (F n) = n -- !!!
Now, this definition of h does not type check:
Couldn't match the rigid variable `a' against `()'
`a' is bound by the type signature for `h'
Expected type: a
Inferred type: ()
When checking the pattern: ()
In the definition of `h': h () (F n) = n
So, it seems that there's a left-to-right bias in type checking
functions over GADTs. I cannot imagine this being by design, for it
certainly seems possible to type check functions of this sort in a
conceptually unbiased fashion.
Anyone to shine a light on this?
TIA,
Stefan
------------------------------------------
Bias.lhs:
> {-# OPTIONS -fglasgow-exts #-}
> -- a simple GADT
> data F :: * -> * where F :: Int -> F ()
> -- type checks
> g :: F a -> a -> Int
> g (F n) () = n
> -- does not type check
> h :: a -> F a -> Int
> h () (F n) = n -- !!!
More information about the Glasgow-haskell-users
mailing list