Type families cause wrapper types to disappear without cause
I tried to summarize the bug in the title, but I'm absolutely at a loss to understand what's going on here.
Here's the output of a GHCi session:
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :set -XTypeFamilies
Prelude> type family Strange (f :: * -> *) ty where { Strange f ty = Maybe (f ty) }
Prelude> newtype Identity a = Identity { runIdentity :: a }
Prelude> newtype StrangeHolder f = StrangeHolder (f Int)
Prelude> let x = Just (Identity 3) :: Strange Identity Int
Prelude> :type x
x :: Maybe (Identity Int)
Prelude> StrangeHolder _ :: StrangeHolder (Strange Identity)
<interactive>:8:15:
Found hole ‘_’ with type: Maybe (Identity Int)
Relevant bindings include
it :: StrangeHolder (Strange Identity) (bound at <interactive>:8:1)
In the first argument of ‘StrangeHolder’, namely ‘_’
In the expression:
StrangeHolder _ :: StrangeHolder (Strange Identity)
In an equation for ‘it’:
it = StrangeHolder _ :: StrangeHolder (Strange Identity)
Prelude> :type x
x :: Maybe (Identity Int)
Prelude> StrangeHolder x :: StrangeHolder (Strange Identity)
<interactive>:10:15:
Couldn't match type ‘Identity Int’ with ‘Int’
Expected type: Maybe Int
Actual type: Maybe (Identity Int)
In the first argument of ‘StrangeHolder’, namely ‘x’
In the expression:
StrangeHolder x :: StrangeHolder (Strange Identity)
GHC reports that it is expecting the type Maybe (Identity Int) as the first argument to StrangeHolder. It also reports that x has type Maybe (Identity Int), but when I go to put x into a StrangeHolder, GHC has seemingly gotten rid of Identity, and now expects x to be of type Maybe Int. I think this is a bug, since the Identity type seems to disappear without cause.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler (Type checker) |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |