我有以下代码:

{-# LANGUAGE DefaultSignatures#-}

import Control.Monad.Trans.Class
import Control.Monad.Trans.Maybe

class Monad m => MonadMaybe m where
  liftMaybe :: Maybe a -> m a
  default liftMaybe :: (MonadTrans t, MonadMaybe m) => Maybe a -> t m a
  liftMaybe = lift . liftMaybe

instance MonadMaybe m => MonadMaybe (MaybeT m)

使用The Glorious Glasgow Haskell编译系统(版本8.0.1.20161117),无法编译:
foo.hs:11:10: error:
    • Couldn't match type ‘m’ with ‘MaybeT m’
      ‘m’ is a rigid type variable bound by
        the instance declaration at foo.hs:11:10
      Expected type: Maybe a -> MaybeT m a
        Actual type: Maybe a -> MaybeT (MaybeT m) a
    • In the expression: Main.$dmliftMaybe @MaybeT m
      In an equation for ‘liftMaybe’:
          liftMaybe = Main.$dmliftMaybe @MaybeT m
      In the instance declaration for ‘MonadMaybe (MaybeT m)’
    • Relevant bindings include
        liftMaybe :: Maybe a -> MaybeT m a (bound at foo.hs:11:10)

但是,在GHC 7.10中,它可以毫无问题地进行编译。

GHC 8是否正确,还是我发现了错误?

最佳答案

尽管GHC 7.10接受它,但是您的代码实际上没有任何意义。参见https://ghc.haskell.org/trac/ghc/ticket/12784进行讨论。

09-26 03:04