我注意到Data.UnionFind使用 IO monad 通过 IORefs 提供指针。我想每个人在以纯代码在本地使用它时都会愉快地调用unsafePerformIO
它,因为数据结构很好理解,但是..
这种数据结构是否有规范的清洁方法?也许是 IO 的包装器,它通过禁止大多数 IO 操作使不可避免unsafePerformIO
的不安全“看起来”变得不那么安全?
我注意到Data.UnionFind使用 IO monad 通过 IORefs 提供指针。我想每个人在以纯代码在本地使用它时都会愉快地调用unsafePerformIO
它,因为数据结构很好理解,但是..
这种数据结构是否有规范的清洁方法?也许是 IO 的包装器,它通过禁止大多数 IO 操作使不可避免unsafePerformIO
的不安全“看起来”变得不那么安全?
这种数据结构是否有规范的清洁方法?也许是围绕 IO 的包装器,它通过禁止大多数 IO 操作来减少不可避免的 unsafePerformIO 不安全的“外观”?
是的,确切地说。您刚刚发明了 ST monad,它由Launchbury 和 Peyton Jones大约 20 年前介绍。
ST
monad 只允许局部范围的记忆效果。值得注意的是,它使用类型系统来保证副作用在使用它们的代码块范围之外是不可见的。
因此,只要您仅通过引用使用内存,仅在本地范围内,您就可以避免unsafePerformIO
并使用纯 ST,例如,实现 union-find。