我使用读者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”都没有真正用于表示法。
答案 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
但是使用(>>=)
会更有意义。