[GHC] #16194: deriving, wrong code: newtype T cat a = MkT ((forall xx. cat xx xx) -> a) deriving stock Functor

GHC ghc-devs at haskell.org
Wed Jan 16 15:33:04 UTC 2019


#16194: deriving, wrong code: newtype T cat a = MkT ((forall xx. cat xx xx) -> a)
deriving stock Functor
-------------------------------------+-------------------------------------
           Reporter:  Iceland_jack   |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.7
           Keywords:  DeriveFunctor  |  Operating System:  Unknown/Multiple
  deriving RankNTypes                |
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 This fails (`deriving stock Functor`) (data type comes from
 [https://duplode.github.io/extras/applicative-archery-manuscript.pdf
 Applicative Archery])

 {{{
 $ ./ghc-stage2 --interactive -ignore-dot-ghci
 GHCi, version 8.7.20181230: https://www.haskell.org/ghc/  :? for help
 Prelude> :set prompt "> "
 > :set -XRankNTypes -XDeriveFunctor -ddump-deriv
 > :set -dsuppress-idinfo -dsuppress-coercions -dsuppress-type-applications
 -dsuppress-uniques -dsuppress-module-prefixes
 > newtype T cat a = MkT ((forall xx. cat xx xx) -> a) deriving Functor

 ==================== Derived instances ====================
 Derived class instances:
   instance Functor (T cat) where
     fmap f (MkT a1) = MkT ((\ b2 b3 -> f (b2 ((\ b1 -> b1) b3))) a1)
     (<$) z (MkT a1)
       = MkT ((\ b3 b4 -> (\ b2 -> z) (b3 ((\ b1 -> b1) b4))) a1)


 Derived type family instances:



 <interactive>:4:62: error:
     • Couldn't match type ‘forall xx. cat xx xx’ with ‘cat xx0 xx0’
       Expected type: cat xx0 xx0 -> a
         Actual type: (forall xx. cat xx xx) -> a
     • In the first argument of ‘\ b2 b3
                                   -> f (b2 ((\ b1 -> b1) b3))’, namely
         ‘a1’
       In the first argument of ‘MkT’, namely
         ‘((\ b2 b3 -> f (b2 ((\ b1 -> b1) b3))) a1)’
       In the expression: MkT ((\ b2 b3 -> f (b2 ((\ b1 -> b1) b3))) a1)
       When typechecking the code for ‘fmap’
         in a derived instance for ‘Functor (T cat)’:
         To see the code I am typechecking, use -ddump-deriv
     • Relevant bindings include
         a1 :: (forall xx. cat xx xx) -> a (bound at <interactive>:4:62)
         fmap :: (a -> b) -> T cat a -> T cat b
           (bound at <interactive>:4:62)

 <interactive>:4:62: error:
     • Couldn't match type ‘forall xx. cat xx xx’ with ‘cat xx1 xx1’
       Expected type: cat xx1 xx1 -> b
         Actual type: (forall xx. cat xx xx) -> b
     • In the first argument of ‘\ b3 b4
                                   -> (\ b2 -> z) (b3 ((\ b1 -> b1) b4))’,
 namely
         ‘a1’
       In the first argument of ‘MkT’, namely
         ‘((\ b3 b4 -> (\ b2 -> z) (b3 ((\ b1 -> b1) b4))) a1)’
       In the expression:
         MkT ((\ b3 b4 -> (\ b2 -> z) (b3 ((\ b1 -> b1) b4))) a1)
       When typechecking the code for ‘<$’
         in a derived instance for ‘Functor (T cat)’:
         To see the code I am typechecking, use -ddump-deriv
     • Relevant bindings include
         a1 :: (forall xx. cat xx xx) -> b (bound at <interactive>:4:62)
         (<$) :: a -> T cat b -> T cat a (bound at <interactive>:4:62)
 >
 }}}

 Generates odd code
 {{{#!hs
 fmap .. = MkT ((\ b2 b3 -> f (b2 ((\ b1 -> b1) b3))) a1)
 }}}

 It works fine (in HEAD) to `deriving newtype Functor` (it didn't in 8.2
 where I checked)

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


More information about the ghc-tickets mailing list