Почему я не могу позвонить спросить с ограничением MonadReader - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь вызвать ask в блоке записи do с ограничением MonadReader, но получаю ошибку о жестких типах.Насколько я могу судить, ask определено для всех MonadReader с?

bar :: MonadReader r m => m r
bar = do
  i <- ask
  return i

Это возвращает

• Couldn't match type ‘m’ with ‘ReaderT r m0’
  ‘m’ is a rigid type variable bound by
    the type signature for:
      bar :: forall r (m :: * -> *). MonadReader r m => m r
    at mem.hs:50:8
  Expected type: m r
    Actual type: ReaderT r m0 r
• In a stmt of a 'do' block: i <- ask
  In the expression:
    do { i <- ask;
         return i }
  In an equation for ‘bar’:
      bar
        = do { i <- ask;
               return i }

1 Ответ

0 голосов
/ 26 декабря 2018

Похоже, вы импортировали ask из Control.Monad.Trans.Reader, но MonadReader импортировали из Control.Monad.Reader.Функция ask из Control.Monad.Trans.Reader мономорфна и работает только с ReaderT.Просто импортируйте Control.Monad.Reader самостоятельно - он реэкспортирует ReaderT, но предоставляет обобщенные версии ask, local и reader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...