Unit unboxed tuple behaving oddly
I’ve just discovered something very peculiar with unboxed tuples in GHC.
f2 x = (# True, False #)
f1 x = (# True #)
f0 x = (# #)
What types do these functions have?
f2 :: a -> (# Bool, Bool #)
f1 :: a -> (# Bool #)
BUT
f0 :: a -> b -> (# b #)
I think this is stupid. It should be
f0 :: a -> (# #)
But in fact even that type isn’t what you expect (ie the analogue of f :: a -> () )
Here are the kinds of the type constructors:
(,,) :: * -> * -> * -> *
(,) :: * -> * -> *
() :: *
(# ,, #) :: * -> * -> * -> #
(# , #) :: * -> * -> #
BUT
(# #) :: * -> #
In both respects unboxed unit tuples are behaving differently to boxed ones. This seems bonkers. I propose to fix this, but I wanted to check if anyone is relying on the current odd behaviour.
Simon
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.2.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |