Because GHC does not allow you to instantiate a polymorphic type
variable with a polymorphic type. For example, you can have
Maybe Int
Maybe (Int -> Int)
but not
Maybe (forall a. a->a)
The Maybe type is defined thus
data Maybe b = Nothing | Just b
so the type (Maybe (forall a. a->a)) would instantiate 'b' with (forall
a. a->a), and GHC just doesn't allow that.
In your program, its the tuple type
data (,) a b = (,) a b
Admittedly the error message is not especially helpful.
Why does GHC have this restriction? Because type inference is much, much
harder without it. There may be a way to lift it, but I don't yet know
what it is.
To get around it, define your own data type:
data MyPr = MyPr (forall a.a->a) (forall a.a->a)
swap1 :: MyPr -> MyPr
Simon
| -----Original Message-----
| From: Dean Herington [mailto:[EMAIL PROTECTED]]
| Sent: 22 January 2003 23:03
| To: [EMAIL PROTECTED]
| Subject: higher-order typing errors
|
| I don't understand why GHC (I was using 5.04.2) should reject these
two
| programs.
|
| ========
|
| {-# OPTIONS -fglasgow-exts #-}
|
| swap1 :: (forall a. a -> a, forall a. a -> a -> a)
| -> (forall a. a -> a -> a, forall a. a -> a)
| swap1 (a, b) = (b, a)
|
| yields:
|
| Bug2.hs:3: parse error on input `,'
|
| ========
|
| {-# OPTIONS -fglasgow-exts #-}
|
| swap2 :: ((forall a. a -> a), (forall a. a -> a -> a))
| -> ((forall a. a -> a -> a), (forall a. a -> a))
| swap2 (a, b) = (b, a)
|
| yields:
|
| Bug2.hs:3:
| Illegal polymorphic type: forall a. a -> a
| In the type: (forall a. a -> a, forall a. a -> a -> a)
| -> (forall a. a -> a -> a, forall a. a -> a)
| While checking the type signature for `swap2'
|
|
| _______________________________________________
| Glasgow-haskell-bugs mailing list
| [EMAIL PROTECTED]
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
_______________________________________________
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs