[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