我在 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
,但那里提供的功能对我的事业没有帮助。
您可以使用
pure ()
作为基本情况:
run = action >> run <|> pure ()
这在 Haskell 中也称为
many
:
run = many action