[GHC] #10085: Type families cause wrapper types to disappear without cause

GHC ghc-devs at haskell.org
Thu Feb 12 22:16:21 UTC 2015


#10085: Type families cause wrapper types to disappear without cause
-------------------------------------+-------------------------------------
              Reporter:  tathougies  |             Owner:
                  Type:  bug         |            Status:  new
              Priority:  normal      |         Milestone:
             Component:  Compiler    |           Version:  7.8.3
  (Type checker)                     |  Operating System:  Unknown/Multiple
              Keywords:              |   Type of failure:  GHC rejects
          Architecture:              |  valid program
  Unknown/Multiple                   |        Blocked By:
             Test Case:              |   Related Tickets:
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------
 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:
 {{{#!hs
  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.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10085>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list