2012-04-24 99 views
24

我注意到Data.UnionFind使用IO monad通過IORefs提供指針。我想大家愉快地在本地使用純代碼時調用unsafePerformIO,因爲數據結構很好理解,但是..以純代碼避免IORefs

是否有一種規範的清潔方法來處理這種數據結構?也許是一個圍繞IO的封裝,通過禁止大多數IO操作使不可避免的不可避免的「看起來」變得不那麼安全?

+0

我相信這個包是打算在IO monad中使用的。大多數Haskeller儘可能遠離'unsafePerformIO'。 – 2012-04-24 17:45:03

回答

30

是否有這樣的數據結構的規範清潔方法?也許是一個IO包裝,通過禁止大多數IO操作使得不可避免的unsafePerformIO不那麼安全「看起來」?

是的,確切地說。您剛剛發明了the ST monad,大約20年前由Launchbury and Peyton Jones推出。

ST monad只允許在本地範圍內的記憶效果。值得注意的是,它使用類型系統來保證副作用在使用它們的代碼塊範圍之外不可見。

所以,只要你僅通過引用使用內存,只在本地範圍內,你可以避免unsafePerformIO並使用純ST代替,例如implement union-find

+0

啊,我沒有意識到ST有內部參考,謝謝。 – 2012-04-24 13:29:16

+0

上面的ST monad鏈接被破壞。這是目前的一個:http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Monad-ST.html – 2017-05-01 14:12:16