2016-09-07 91 views
4

为什么在Control.Monad.Reader中有读者monad和MonadReader monad?软件包文档讨论了读者monad,然后直接发布到MonadReader文档中,没有任何解释。这些monads有什么区别?阅读这些参考页面让我不再困惑。有趣的是,Haskell wikibook的Reader monad页面尚未写入!阅读器和MonadReader

+0

据我所知,这是一个抽象的行为可以像“读者”monad。例如,它可能是一堆monad变压器。如果我错了,请纠正我。 – wowofbob

回答

11

没有MonadReader monad。这是一个monads类,也就是那些可以用作 a Reader(通常,因为它们被定义为在某处有ReaderT的monad变压器堆栈)的那些monad。所以,

  • Reader是具体的单子是只有作为一个读者,因为它有ReaderT仅适用于琐碎的身份单子:

    type Reader r = ReaderT r Identity 
    

    因此明显的MonadReader实例,但没有做任何其他事情。

  • MonadReader所有 monads类,可以从某些环境读取。再次,这包括Reader本身,但也MaybeT (ReaderT Int (ListT IO))