我想將以下狀態命令式代碼轉換成Haskell。有狀態循環與不同類型的休息
while (true) {
while (get()) {
if (put1()) {
failImmediately();
}
}
if (put2()) {
succeedImmediately();
}
}
無論是put1
和put2
讀取系統的狀態,並對其進行修改。爲了簡單起見,只需閱讀狀態即可。 failImmediately
應該跳出無限循環並呈現一種類型的結果,succeedImmediately
也應該爆發,但呈現不同的結果。
我試圖用爲State Env Result
其中Env
代表的環境狀況和Result
是像Either Failure Success
一些定製Failure
和Success
。
我一直在努力解決這個問題,即一旦生成一個表達式(斷開循環)並繼續前進,整個結果表達式就應該摺疊成爲Failure
/Success
。
我有一個想法是使用Either Exit()
其中data Exit = Success | Failure
和使用StateT
在某種程度上的Left
表現的Either
彷彿Either
是被鏈接的單子,即忽略任何後續行動。
我真的很感激任何靈感或樣本的haskell代碼,將實現與上面的代碼片段相同的行爲。
編輯:精緻版本轉移到單獨的問題「Stateful computation with different types of short-circuit (Maybe, Either)」。
你應該看看['EitherT(國信封結果)'](https://hackage.haskell.org/package/either-4.4.1/docs /控制-M onad反式Either.html)。讓我知道如果這個提示是不夠的,你需要更多的細節:) – Cactus
我感覺這可能是我需要的除了我沒有絲毫的想法如何在這種情況下使用它:(如果你會如此詳盡,我會非常感謝 – jakubdaniel