haskell – unsafePerformIO访问依赖的C资源时

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

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

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

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

最佳答案 在这里,我回答了我刚才的真实经历,因为

“纯粹”的功能并不是很纯粹.

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

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

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

点赞