我想編寫可能失敗的操作,但有一種方法可以回滾。可組合原子類操作
例如 - 一個預訂酒店房間的外部電話,以及一個外部電話來對信用卡收費。這些電話都可能失敗,例如沒有剩餘房間,無效的信用卡。兩種方式都可以回滾 - 取消酒店房間,取消信用額度。
- 是否有這種類型的(不是真正的)原子的名稱。每當我搜索haskell事務,我得到
STM
。 - 是否有抽象,合成它們的方法,或haskell或任何其他語言的庫?
我覺得你可以編寫一個monad Atomic T
,它將跟蹤這些操作並在出現異常時將其回滾。
編輯:
這些操作可能是IO
操作。如果操作只是記憶操作,正如這兩個答案所暗示的,STM就足夠了。
例如預訂酒店將通過HTTP請求。數據庫操作,例如通過套接字通信插入記錄。
在現實世界中,對於不可逆轉的操作,在操作完成之前有一段寬限期 - 例如,信用卡付款和酒店預訂可能在一天結束時結算,因此在此之前取消可以。
啊,但STM明確禁止IO。這個問題詢問IO操作,如果有必要,可以使用第二個IO操作來反轉。 – 2012-07-12 19:03:04
STM與IO操作非常兼容 - 它只是不直接執行它們(http://book.realworldhaskell.org/read/software-transactional-memory.html)。不是所有的IO *都可以是事務性的 - 對'launchMissiles'沒有'rollback'動作 – amindfv 2012-07-12 19:38:16
我沒有看到這個問題明確提到'IO'。但在任何情況下,IO的答案都是無法完成的,因爲IO IO monad具有不可撤消地破壞信息的操作,無法複製狀態。實際上,'IO' monad是專門爲此設計的! – 2012-07-12 19:40:38