重复状态,直到它没有变化/稳定

Mic*_*mza 1 monads haskell

我正在尝试重复运行状态转换,直到状态不变.我搜索Hoogle

Eq s => State s () -> State s ()
Run Code Online (Sandbox Code Playgroud)

但没有发现看起来合适的东西.

如何反复运行状态转换,直到它没有改变?

Rei*_*chs 5

你可以这样做State,但没有特别的好处.为什么不:

idempotently :: Eq a => (a -> a) -> a -> a
idempotently f a = if a' == a then a else idempotently f a' where a' = f a

idempotentlyM :: Eq s => (s -> s) -> State s ()
idempotentlyM f = modify (idempotently f)
Run Code Online (Sandbox Code Playgroud)

如果你从a开始State s (),你可以execState让它s -> s出来.

当然,不能保证f不会分歧,因此idempotently f可能永远不会终止.

  • 顺便说一句,你是两次计算`fa`,这里的let-binding会很好;) (2认同)