2012-04-24 79 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