首次运行时发生短路时 Monad 变压器回路失效

问题描述 投票:0回答:1

我在 haskell 中有一个 RWST,而不是 Maybe,它在某些条件下会短路。我想运行这个操作直到它返回Nothing,并得到最后一个Just。所以我的情况如下;

type St = MyState
type Re = MyRead
type Wr = MyWriter
type Foo = RWST Re Wr St Maybe

action :: Foo ()

我想到实现这一目标的唯一方法是定义以下内容;

run = action >> run <|> action

它的缺点是,如果第一次运行时发生短路,即使有输出,我也什么也得不到,因为

run
运行该动作两次。有没有更好的循环方式?我研究了
extra
,但那里提供的功能对我的事业没有帮助。

haskell monad-transformers
1个回答
0
投票

您可以使用

pure ()
作为基本情况:

run = action >> run <|> pure ()

这在 Haskell 中也称为

many

run = many action
© www.soinside.com 2019 - 2024. All rights reserved.