2
我正在爲一個班級編寫棋盤遊戲。 Control.Monad.Loops有一個iterateUntil函數,它非常接近我想要的。然而,我想讓我的行動採取一個參數(這是本次回合的董事會狀態)。所以我的問題是,以下是如何慣用的?有什麼我可以做的,以消除顯式遞歸?帶有狀態參數的IterateUntil
iterateUntilIO :: (a -> IO a) -> a -> (a -> Bool) -> IO a
iterateUntilIO action state predicate = if predicate state
then return state
else do
nextState <- action state
iterateUntilIO action nextState predicate
我認爲這很好 - 將循環封裝到組合器中的想法很好。我認爲讓自然更加自然的習慣的唯一方法是使用警衛而不是「if .. then .. else」。例如'iterateUntilIO動作狀態謂詞|謂詞狀態= ... |否則= ...' – luqui
哦,這與'IO'沒有任何關係,這可以在任何monad中使用。我會考慮調用這個函數'untilM',並給它的類型簽名'(Monad m)=>(a - > m a) - > a - >(a - > Bool) - > m a'。 – luqui
這不是iterateUntilM? –