将 mtl 的 MonadReader 与 haskeline 一起使用有类型错误
Using mtl's MonadReader with haskeline has type error
我想将 InputT (ReaderT Int IO) a
与 MonadReader 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
我该如何解决这个错误。
完整的源代码是 here
这样编译:
{-# 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
而不是 必须与 m
相同。在实际类型中 m b
中的 m
必须与 m a
中的 m
相同。
我想将 InputT (ReaderT Int IO) a
与 MonadReader 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
我该如何解决这个错误。
完整的源代码是 here
这样编译:
{-# 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
而不是 必须与 m
相同。在实际类型中 m b
中的 m
必须与 m a
中的 m
相同。