2

我有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]部分。 是否有可能在不手动展开并再次手动将结果放在一起的情况下实现这一目标?我需要一个 List monad 在我的 monad 堆栈的底部来获取简单的代码吗?Reader Monad 显然不是 MonadPlus 类的实例。x ++[c]y
xy

4

3 回答 3

3

我不明白你的意思是展开xy

我将最后一行作为

return (x ++ y)

我误解你想要什么了吗?

于 2010-01-21T09:58:46.120 回答
2

您也可以简单地定义

f = fmap concat . mapM f'

mapM f' xs产生一个 type m [[c]], wherexs :: [a]和的值m = StateT Int (Reader b),然后fmap concat在“monad 内部”连接列表。)

于 2010-01-22T17:09:22.040 回答
1

f' s和都是f st一个 monad 中的值,即StateT Int Reader b. 所以你已经有了x :: [c]并且y :: [c]你只需要写return (x ++ y),正如戴夫欣顿所说。

于 2010-01-21T10:26:28.870 回答