单子发电产品及多个单子的堆叠
-
22-09-2019 - |
题
我有功能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
和y
并再次手动一起把结果?我需要一个列表单子是我的单子堆栈底部得到简单的代码?读者单子显然不是MonadPlus类的一个实例。
解决方案
我不明白你的意思,通过展开x
和y
。
我将具有最后一行作为
return (x ++ y)
我误解你想要什么?
其他提示
您也可以简单地定义
f = fmap concat . mapM f'
(mapM f' xs
产生型m [[c]]
,其中xs :: [a]
和m = StateT Int (Reader b)
,然后fmap concat
符连接的列表 “的单子内部”。的值)
两者f' s
和f st
是在一个单子,即StateT Int Reader b
值。所以,你已经有x :: [c]
和y :: [c]
,你只需要编写return (x ++ y)
,戴夫韩丁说。
不隶属于 StackOverflow