1

我想InputT (ReaderT Int IO) aMonadReader Int.

我写下面的代码在 InputT 上创建实例 MonadReader

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
module HaskelineMonadReader where

import Control.Monad.Reader
import System.Console.Haskeline

instance MonadReader r m => MonadReader r (InputT m) where
    ask = lift ask
    local = mapInputT . local

main :: IO ()
main = putStrLn "HI"

但我得到这种类型的错误。

HaskelineMonadReader.hs:11:13:
Couldn't match type ‘m0 a0 -> m0 a0’ with ‘forall b. m b -> m b’
Expected type: (m0 a0 -> m0 a0) -> InputT m a -> InputT m a
  Actual type: (forall b. m b -> m b) -> InputT m a -> InputT m a
Relevant bindings include
  local :: (r -> r) -> InputT m a -> InputT m a
    (bound at HaskelineMonadReader.hs:11:5)
In the first argument of ‘(.)’, namely ‘mapInputT’
In the expression: mapInputT . local

我该如何解决这个错误。

完整的源代码在这里

4

1 回答 1

1

这编译:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
module HaskelineMonadReader where

import Control.Monad.Reader
import System.Console.Haskeline

instance MonadReader r m => MonadReader r (InputT m) where
    ask = lift ask
    local f = mapInputT (local f)

main :: IO ()
main = putStrLn "HI"

更新

这是错误消息:

Couldn't match type ‘m0 a0 -> m0 a0’
               with ‘forall b. m b -> m b’

Expected type: (m0 a0 -> m0 a0)       -> InputT m a -> InputT m a
Actual type:   (forall b. m b -> m b) -> InputT m a -> InputT m a

所以看起来预期的类型更通用,因为不必m0与相同。在实际类型中,in必须与in相同。mmm bmm a

于 2016-06-18T01:35:34.803 回答