Left-to-right bias in type checking GADT functions

Simon Peyton-Jones simonpj at microsoft.com
Tue Jun 20 07:06:37 EDT 2006


Yes, it's quite deliberate.  See 5.4 of
	
http://research.microsoft.com/%7Esimonpj/papers/gadt/gadt-icfp.pdf
The alternative design choice is to reject both programs, but in Haskell
(because of laziness) the evaluation order is prescribed, so accepting
the former seems right.

Simon

| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org
[mailto:glasgow-haskell-users-bounces at haskell.org]
| On Behalf Of Stefan Holdermans
| Sent: 20 June 2006 08:53
| To: Glasgow Haskell Users
| Subject: Left-to-right bias in type checking GADT functions
| 
| 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                -- !!!
| 
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users


More information about the Glasgow-haskell-users mailing list