我注意到Data.UnionFind使用IO monad通过IORefs提供指针。我想每个人都很乐意在纯代码中本地使用它时调用unsafePerformIO
,因为数据结构很容易理解,但是..
对于此类数据结构,是否有规范的更干净的方法? 也许是围绕 IO 的包装器,通过禁止大多数 IO 操作使不可避免的unsafePerformIO
"外观"变得不那么不安全?
对于此类数据结构,是否有规范的更干净的方法?也许是围绕 IO 的包装器,通过禁止大多数 IO 操作使不可避免的不安全执行IO 不那么不安全的"外观"?
是的,确切地说。你刚刚发明了ST monad,由Launchbury和Peyton Jones在大约20年前推出。
ST
monad 只允许局部范围的记忆效果。值得注意的是,它使用类型系统来保证副作用在使用它们的代码块的范围之外不可见。
因此,只要您仅通过引用(仅在本地范围内)使用内存,就可以避免unsafePerformIO
并使用纯 ST,例如,实现联合查找。