访问依赖的C资源时unsafePerformIO

时间:2015-10-29 15:17:44

标签: haskell ffi

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

现在catch:有一个函数将指针指向parent并返回指向child的指针:

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

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

1 个答案:

答案 0 :(得分:2)

在这里,我回答了我刚才所拥有的真实经历,因为 “纯粹”的功能并不是很纯粹。

我可以用这些词来表达:可以受到秩序影响的一切 执行应始终保持在IOIO monad是Haskell的标准 确保执行顺序的可靠方法。如果订单很重要,那么 函数应该存在IO monad。

现在,如果在这种特殊情况下为什么订单不重要,请记住 必须分配父资源以及子资源 他们被释放了。当他们被释放时,你不会得到相同的结果(但是 而是分段错误),因此参考透明度被打破。所以这些 资源相关函数应保留在IO

另外,我不认为同时分配不同的对象是不可能的 单个程序执行期间的地址。这再次打破了参考 透明度。