2016-09-07 17 views
4

Control.Monad.ReaderにReader MonadとMonadReaderモナドがあるのはなぜですか?パッケージのドキュメントでは、Readerのモナドについて説明し、MonadReaderのマニュアルを直接説明しません。これらのモナドの違いは何ですか?これらのリファレンスページを読むことは、私を混乱させるだけのことになりません。興味深いことに、Haskellウィキブックスの読者モナドのページはまだ書かれていません!ReaderとMonadReader

+0

私が理解しているように、これは「リーダー」モナドのように振る舞う可能性があるものすべてを抽象化したものです。例えば、モナド変圧器のスタックとすることができる。私が間違っているなら、私を修正してください。 – wowofbob

答えて

11

MonadReaderモナドはありません。これは、クラスのモナド、すなわちとしてaReaderとして使用されるモナドのものです(一般的には、それらはのあるモナドトランススタックとして定義されているためです)。それはReaderTだけ些細なアイデンティティモナドに適用しているのでので、

  • Readerは、リーダーとしてのみ作用する特定モナドである:

    type Reader r = ReaderT r Identity 
    

    これは明らかにこのようMonadReaderのインスタンスでありますしかし、何もしません。

  • MonadReaderは、ある環境から読み取ることができるすべてののモナドです。ここでも、Reader自体が含まれますが、MaybeT (ReaderT Int (ListT IO))も含まれます。