我的功能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类的实例。
答案 0 :(得分:3)
通过展开x
和y
,我无法理解您的意思。
我的最后一行是
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' s
和f st
都是一个monad中的值,即StateT Int Reader b
。所以你已经有了x :: [c]
和y :: [c]
,你只需要写return (x ++ y)
,正如Dave Hinton所说。