monad变形金刚和多个monad的堆叠

时间:2010-01-21 08:44:54

标签: haskell monads functional-programming monad-transformers

我的功能f带有签名f :: [a] -> StateT Int Reader b [c]f'带有签名f' :: a -> StateT Int Reader b [c]

f(非常简化)中的计算看起来像:

f [] = return []
f (s:st) = f' s >>= \x ->
           f st >>= \y ->
           return $ ...

代替...我想将[c] x ++ [c] y部分的x部分归还给monad东西缠着。
是否有可能在不手动展开y和{{1}}并手动将结果再次放在一起的情况下实现这一目标?我需要在monad堆栈底部使用List monad才能获得简单的代码吗? Reader Monad显然不是MonadPlus类的实例。

3 个答案:

答案 0 :(得分:3)

通过展开xy,我无法理解您的意思。

我的最后一行是

return (x ++ y)

我是否误解了你想要的东西?

答案 1 :(得分:2)

您也可以简单地定义

f = fmap concat . mapM f'

mapM f' xs生成m [[c]]类型的值,其中xs :: [a]m = StateT Int (Reader b),然后fmap concat连接“monad内部”列表。)

答案 2 :(得分:1)

f' sf st都是一个monad中的值,即StateT Int Reader b。所以你已经有了x :: [c]y :: [c],你只需要写return (x ++ y),正如Dave Hinton所说。