在纯代码中避免使用IORef

时间:2012-04-24 13:18:26

标签: haskell data-structures monads union-find ioref

我注意到Data.UnionFind使用IO monad通过IORefs提供指针。我想大家在纯代码中本地使用它时会愉快地调用unsafePerformIO,因为数据结构很好理解,但是......

这种数据结构是否有规范的清洁方法?也许IO的包装通过禁止大多数IO操作使得不可避免的unsafePerformIO不那么不安全“看”?

1 个答案:

答案 0 :(得分:31)

  

这种数据结构是否有规范的清洁方法?也许是IO的包装器,通过禁止大多数IO操作,使不可避免的不安全的PerformIO不那么“不安全”了?“

是的,确切地说。您刚刚发明了the ST monad,大约20年前由Launchbury and Peyton Jones引入。

ST monad仅允许本地范围内存效果。值得注意的是,它使用类型系统来保证在使用它们的代码块范围之外看不到副作用。

因此,只要您仅通过引用使用内存,只能在本地范围内使用,您可以避免unsafePerformIO并使用纯ST代替implement union-find