Использование mtl MonadReader с haskeline имеет ошибку типа
Я хочу использовать InputT (ReaderT Int IO) a
с MonadReader Int
,
Я пишу ниже код, чтобы сделать экземпляр MonadReader на InputT
{-# 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
Как я могу исправить эту ошибку.
Полный исходный код здесь
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
не должен быть таким же, как m
, В фактическом типе m
в m b
должен быть таким же, как m
в m a
,