Использование 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,

Другие вопросы по тегам