我正在尝试重复运行状态转换,直到状态不变.我搜索Hoogle了
Eq s => State s () -> State s ()
但没有发现看起来合适的东西.
如何反复运行状态转换,直到它没有改变?
你可以这样做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)
如果你从a开始State s ()
,你可以execState
让它s -> s
出来.
当然,不能保证f
不会分歧,因此idempotently f
可能永远不会终止.