我注意到Data.UnionFind使用IO monad通过IORefs提供指针。我想大家愉快地在本地使用纯代码时调用unsafePerformIO
,因为数据结构很好理解,但是..以纯代码避免IORefs
是否有一种规范的清洁方法来处理这种数据结构?也许是一个围绕IO的封装,通过禁止大多数IO操作使不可避免的不可避免的“看起来”变得不那么安全?
我注意到Data.UnionFind使用IO monad通过IORefs提供指针。我想大家愉快地在本地使用纯代码时调用unsafePerformIO
,因为数据结构很好理解,但是..以纯代码避免IORefs
是否有一种规范的清洁方法来处理这种数据结构?也许是一个围绕IO的封装,通过禁止大多数IO操作使不可避免的不可避免的“看起来”变得不那么安全?
是否有这样的数据结构的规范清洁方法?也许是一个IO包装,通过禁止大多数IO操作使得不可避免的unsafePerformIO不那么安全“看起来”?
是的,确切地说。您刚刚发明了the ST monad,大约20年前由Launchbury and Peyton Jones推出。
ST
monad只允许在本地范围内的记忆效果。值得注意的是,它使用类型系统来保证副作用在使用它们的代码块范围之外不可见。
所以,只要你仅通过引用使用内存,只在本地范围内,你可以避免unsafePerformIO
并使用纯ST代替,例如implement union-find。
啊,我没有意识到ST有内部参考,谢谢。 – 2012-04-24 13:29:16
上面的ST monad链接被破坏。这是目前的一个:http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Monad-ST.html – 2017-05-01 14:12:16
我相信这个包是打算在IO monad中使用的。大多数Haskeller尽可能远离'unsafePerformIO'。 – 2012-04-24 17:45:03