【问题标题】:Avoiding IORefs in pure code在纯代码中避免 IORef
【发布时间】:2012-04-24 13:18:25
【问题描述】:

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

对于此类数据结构,是否有规范的清洁方法?也许是一个围绕 IO 的包装器,通过禁止大多数 IO 操作,使不可避免的unsafePerformIO“看起来”不那么不安全?

【问题讨论】:

  • 我相信这个包打算在 IO monad 中使用。大多数 Haskeller 尽可能远离unsafePerformIO

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


【解决方案1】:

对于此类数据结构,是否有规范的清洁方法?也许是 IO 的包装器,通过禁止大多数 IO 操作,使不可避免的 unsafePerformIO “看起来”不那么不安全?

是的,没错。你刚刚发明了the ST monad,由Launchbury and Peyton Jones 在大约20 年前介绍。

ST monad 只允许局部范围的记忆效应。值得注意的是,它使用类型系统来保证副作用在使用它们的代码块范围之外是不可见的。

因此,只要您仅通过引用使用内存,仅在本地范围内,您就可以避免使用unsafePerformIO,而使用纯 ST,例如 implement union-find

【讨论】:

猜你喜欢
  • 2018-04-09
  • 2011-09-03
  • 1970-01-01
  • 2014-03-07
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多