我正在编写绑定(第一次)。在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
类型的包装器。我不应该这样做吗?
答案 0 :(得分:2)
在这里,我回答了我刚才所拥有的真实经历,因为 “纯粹”的功能并不是很纯粹。
我可以用这些词来表达:可以受到秩序影响的一切
执行应始终保持在IO
。 IO
monad是Haskell的标准
确保执行顺序的可靠方法。如果订单很重要,那么
函数应该存在IO
monad。
现在,如果在这种特殊情况下为什么订单不重要,请记住
必须分配父资源以及子资源
他们被释放了。当他们被释放时,你不会得到相同的结果(但是
而是分段错误),因此参考透明度被打破。所以这些
资源相关函数应保留在IO
。
另外,我不认为同时分配不同的对象是不可能的 单个程序执行期间的地址。这再次打破了参考 透明度。