
I was just playing around and noticed that the kind of the function arrow in GHC is (?? -> ? -> *) when I (naively) expected it to be (* -> * -> *). After looking at (http://hackage.haskell.org/packages/archive/ghc/6.10.2/doc/html/Type.html#5) I see that the kind of (->) means that the parameter type cannot be an unboxed tuple, whilst the result type can be anything. Why is this? After reading this documentation I would expect the kind (? -> ? -> *). I'm now wondering if the kind of (->) could cause problems if the following style of declaration is requried:
type FunArg a b = (a -> b, a)
*Main> :k FunArg FunArg :: * -> * -> * By using type variables, whose default kind is *, the function type is fixed to use only boxed types. But if one wanted to allow unboxed type parameters the kind would be wrong, and an explicit kind signature of # or ? can't be given as they are not part of Haskell's source language. I guess my question is why the (?? -> ? -> *) kind on (->) and what to do if synonyms or data types over (->) are required such as the example just stated. I'm just curious. Thanks, Dominic