[GHC] #12784: Typechecker regression in GHC 8.0.2 involving DefaultSignatures

GHC ghc-devs at haskell.org
Sun Oct 30 17:54:04 UTC 2016


#12784: Typechecker regression in GHC 8.0.2 involving DefaultSignatures
-------------------------------------+-------------------------------------
           Reporter:  RyanGlScott    |             Owner:
               Type:  bug            |            Status:  new
           Priority:  highest        |         Milestone:  8.0.2
          Component:  Compiler       |           Version:  8.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  GHC rejects
  Unknown/Multiple                   |  valid program
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 This code compiles without issue on GHC 8.0.1 and earlier, but not with
 GHC 8.0.2 or HEAD. This was adapted from the [https://github.com/kazu-
 yamamoto/logger/blob/master/monad-logger/Control/Monad/Logger.hs monad-
 logger] library (which fails to build with GHC 8.0.2 and HEAD due to the
 same issue):

 {{{#!hs
 {-# LANGUAGE DefaultSignatures #-}
 {-# LANGUAGE GADTs #-}
 module MonadLogger where

 import           Control.Monad.IO.Class
 import qualified Control.Monad.Trans.Class as Trans
 import           Control.Monad.Trans.Identity

 data Loc
 data LogSource
 data LogLevel
 data LogStr

 class ToLogStr msg
 class Monad m => MonadLogger m
 class (MonadLogger m, MonadIO m) => MonadLoggerIO m where
     askLoggerIO :: m (Loc -> LogSource -> LogLevel -> LogStr -> IO ())
     default askLoggerIO :: (Trans.MonadTrans t, MonadLogger (t m), MonadIO
 (t m))
                         => t m (Loc -> LogSource -> LogLevel -> LogStr ->
 IO ())
     askLoggerIO = Trans.lift askLoggerIO

 instance MonadLogger m => MonadLogger (IdentityT m)
 instance MonadLoggerIO m => MonadLoggerIO (IdentityT m)
 }}}

 On GHC HEAD, this fails with:

 {{{
 [1 of 1] Compiling MonadLogger      ( MonadLogger.hs, interpreted )

 MonadLogger.hs:23:10: error:
     • Couldn't match type ‘m’ with ‘IdentityT m’
       ‘m’ is a rigid type variable bound by
         the instance declaration at MonadLogger.hs:23:10-55
       Expected type: IdentityT
                        m (Loc -> LogSource -> LogLevel -> LogStr -> IO ())
         Actual type: IdentityT
                        (IdentityT m) (Loc -> LogSource -> LogLevel ->
 LogStr -> IO ())
     • In the expression: MonadLogger.$dmaskLoggerIO @IdentityT m
       In an equation for ‘askLoggerIO’:
           askLoggerIO = MonadLogger.$dmaskLoggerIO @IdentityT m
       In the instance declaration for ‘MonadLoggerIO (IdentityT m)’
     • Relevant bindings include
         askLoggerIO :: IdentityT
                          m (Loc -> LogSource -> LogLevel -> LogStr -> IO
 ())
           (bound at MonadLogger.hs:23:10)
 }}}

 This stopped typechecking after d2958bd08a049b61941f078e51809c7e63bc3354
 (i.e, #12220).

 As a workaround, you can change the default signature to:

 {{{#!hs
     default askLoggerIO :: (Trans.MonadTrans t, MonadLoggerIO n, t n ~ m)
                          => t n (Loc -> LogSource -> LogLevel -> LogStr ->
 IO ())
 }}}

 And it'll work.

 Any thoughts on this, Simon?

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


More information about the ghc-tickets mailing list