访问依赖 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
类型的包装器。我有理由不这样做吗?
这里根据我刚才的真实经历来回答,因为
不完全纯的“纯”函数。
我可以用这些话来表述:所有可以被顺序影响的东西
执行次数应始终保持在 IO
。 IO
monad 是 Haskell 是标准的
确保执行顺序的可靠方法。如果顺序很重要,您的
函数应该存在于 IO
monad.
现在,如果在这种特殊情况下顺序很重要的原因不是很明显,请记住
必须分配父资源和子资源,然后
他们被释放了。当他们被释放时,你不会得到相同的结果(但是
而是分段错误),因此引用透明性被破坏。所以这些
依赖资源的函数应该留在 IO
.
另外,我不认为同时分配不同的对象是不可能的
单个程序执行期间的地址。这又会破坏引用
透明度。
我正在编写绑定(第一次)。在 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
类型的包装器。我有理由不这样做吗?
这里根据我刚才的真实经历来回答,因为 不完全纯的“纯”函数。
我可以用这些话来表述:所有可以被顺序影响的东西
执行次数应始终保持在 IO
。 IO
monad 是 Haskell 是标准的
确保执行顺序的可靠方法。如果顺序很重要,您的
函数应该存在于 IO
monad.
现在,如果在这种特殊情况下顺序很重要的原因不是很明显,请记住
必须分配父资源和子资源,然后
他们被释放了。当他们被释放时,你不会得到相同的结果(但是
而是分段错误),因此引用透明性被破坏。所以这些
依赖资源的函数应该留在 IO
.
另外,我不认为同时分配不同的对象是不可能的 单个程序执行期间的地址。这又会破坏引用 透明度。