从Reader monad中加入monadic代码

时间:2017-06-26 23:51:37

标签: haskell monads

我使用读者monad编写了一些monadic代码,我想知道是否有任何方法可以使用do-notation编写:

m = Map.fromList [("This","is"), ("is","the"), ("the","secret")]
f x m = fromMaybe "default" $ Map.lookup x m

r :: String -> Reader (Map String String) String)
r x = reader $ \m1 -> f x m1

runReader ((r "This") >>= r >>= r) m
-- "secret"

现在你怎么用do notation写下最后一个语句。

我感觉所有使用runX函数的“扩展monad”都没有真正用于表示法。

2 个答案:

答案 0 :(得分:3)

你可以做到

runReader threeRs m where
  threeRs = do
   a <- r "This"
   b <- r a
   r b

虽然我不推荐这个。在这种情况下,使用bind(>>=)运算符非常适合实际链接。

当对monadic操作进行排序时,恕我直言是最有用的,其中不需要所有结果,结果应该组合,或者在两者之间使用纯函数。另请参阅Should do-notation be avoided in Haskell?

答案 1 :(得分:2)

do - 符号只是:

runReader r' m
    where r' = do
        x <- r "This"
        y <- r x
        z <- r y
        return z

但是使用(>>=)会更有意义。