monad 变压器和多个 monad 的堆叠
我有带有签名 f :: [a] -> 的函数
和带有签名 f
StateT Int Reader b [c]f' :: a -> 的
f'
StateT Int Reader b [c]
f 中的计算(非常简化)如下所示:
f [] = return []
f (s:st) = f' s >>= \x ->
f st >>= \y ->
return $ ...
并且代替 ... 我想返回 < 的 [c]
部分code>x ++
y
的 [c]
部分,其中包含 monad 内容。
是否有可能在不手动解开 x
和 y
并再次手动将结果放在一起的情况下实现这一目标?我是否需要在 monad 堆栈底部添加一个 List monad 才能获得简单的代码? Reader Monad 显然不是 MonadPlus 类的实例。
I have function f
with signature f :: [a] -> StateT Int Reader b [c]
, and f'
with signature f' :: a -> StateT Int Reader b [c]
The computation in f (very simplified) looks like that:
f [] = return []
f (s:st) = f' s >>= \x ->
f st >>= \y ->
return $ ...
And in place of the ... I would like to return the [c]
part of x
++
the [c]
part of y
with the monad stuff wrapped around.
Is there a possibility to achieve that without manually unwrapping x
and y
and manually put the result together again? Do I need a List monad at the bottom of my monad stack to get simple code? The Reader Monad is obviously not an instance of the MonadPlus class.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不明白你打开
x
和y
的意思。我会将最后一行作为
我是否误解了你想要的?
I don't get what you mean by unwrapping
x
andy
.I would have the last line as
Do I misunderstand what you want?
您还可以简单地定义
(
mapM f' xs
生成一个m [[c]]
类型的值,其中xs :: [a]
和 m = StateT Int (Reader b),然后 fmap concat 连接列表“在 monad 内部”。)You can also simply define
(
mapM f' xs
produces a value of typem [[c]]
, wherexs :: [a]
andm = StateT Int (Reader b)
, and thenfmap concat
concatenates the lists "inside the monad".)f' s
和f st
都是一个 monad 中的值,即StateT Int Reader b
。因此,您已经有了x :: [c]
和y :: [c]
,只需编写return (x ++ y)
>,正如戴夫·辛顿所说。Both
f' s
andf st
are values in one monad, namelyStateT Int Reader b
. So you already havex :: [c]
andy :: [c]
and you just need to writereturn (x ++ y)
, as Dave Hinton said.