我注意到Data.UnionFind使用IO monad通过IORefs提供指针。我想大家在纯代码中本地使用它时会愉快地调用unsafePerformIO
,因为数据结构很好理解,但是......
这种数据结构是否有规范的清洁方法?也许IO的包装通过禁止大多数IO操作使得不可避免的unsafePerformIO
不那么不安全“看”?
答案 0 :(得分:31)
这种数据结构是否有规范的清洁方法?也许是IO的包装器,通过禁止大多数IO操作,使不可避免的不安全的PerformIO不那么“不安全”了?“
是的,确切地说。您刚刚发明了the ST monad,大约20年前由Launchbury and Peyton Jones引入。
ST
monad仅允许本地范围内存效果。值得注意的是,它使用类型系统来保证在使用它们的代码块范围之外看不到副作用。
因此,只要您仅通过引用使用内存,只能在本地范围内使用,您可以避免unsafePerformIO
并使用纯ST代替implement union-find。