访问依赖 C 资源时的 unsafePerformIO

unsafePerformIO when accessing dependent C resources

我正在编写绑定(第一次)。在 C 级别上有分配某种资源的函数,我们称之为 ParentRes。它returnsIO (Ptr ParentRes)。每次创建ParentRes,都会分配一个子资源,我们称它为ChildRes。这些东西都是静态的,子指针不能改变,当释放父资源时它会被释放。

现在问题来了:有一个函数接受父指针和 returns 子指针:

foreign import ccall unsafe "…"
  c_get_child_res :: Ptr ParentRes -> IO (Ptr ChildRes)

我想使用 unsafePerformIO 编写 Ptr ParentRes -> Ptr ChildRes 类型的包装器。我有理由不这样做吗?

这里根据我刚才的真实经历来回答,因为 不完全纯的“纯”函数。

我可以用这些话来表述:所有可以被顺序影响的东西 执行次数应始终保持在 IOIO monad 是 Haskell 是标准的 确保执行顺序的可靠方法。如果顺序很重要,您的 函数应该存在于 IO monad.

现在,如果在这种特殊情况下顺序很重要的原因不是很明显,请记住 必须分配父资源和子资源,然后 他们被释放了。当他们被释放时,你不会得到相同的结果(但是 而是分段错误),因此引用透明性被破坏。所以这些 依赖资源的函数应该留在 IO.

另外,我不认为同时分配不同的对象是不可能的 单个程序执行期间的地址。这又会破坏引用 透明度。