Hackage — Где определена реализация MonadReader для ReaderT?

Кажется, я не могу найти, где определены два относительно простых метода Haskell.

Это около ReaderT. Я ищу его реализацию ask и local, как того требует контракт MonadReader.

На https://hackage.haskell.org/package/mtl-2.1.2/docs/src/Control-Monad-Reader-Class.html#ask Я прочитал:

instance Monad m => MonadReader r (ReaderT r m) where
  ask = ReaderT.ask
  local = ReaderT.local

а то нигде не могу найти ни ReaderT.ask ни ReaderT.local.

Это первый раз, когда я не нахожу реализации, просматривая Hackage.

Я что-то упускаю?


person Marco Faustinelli    schedule 15.07.2015    source источник


Ответы (1)


Этот файл содержит оператор импорта

import qualified Control.Monad.Trans.Reader as ReaderT (ask, local, reader)

поэтому ReaderT.ask и т. д. обратитесь к этому модулю из пакета transformers-0.3.0.0 (единственная указанная зависимость от mtl-2.1.2. Если вы посмотрите на главную страницу Hackage каждого пакета, вы заметите, что это не самые новые версии любого пакета.)

В общем, transformers и mtl определяют множество функций с одним и тем же именем, за исключением того, что версии transformers работают только с типом преобразователя, непосредственно реализующим соответствующий эффект, в то время как mtl использует систему классов Monad*, чтобы сделать их методами, которые могут автоматически переноситься на другие, обертывая трансформаторы.

Для непосредственно реализующего преобразователя, как и в вашем случае, конкретный экземпляр метода, используемый в mtl, обычно просто ссылается на соответствующую функцию transformer.

person Ørjan Johansen    schedule 15.07.2015