FFI和指针
我正在使用FFI来使用C中的一个函数,该函数接受一个结构并返回相同的结构。 我看到的参考文献说,我必须使用指向这些结构的指针才能将其导入到Haskell中。 所以,例如。
data Bar = Bar { a :: Int, b :: Int }
type BarPtr = Ptr (Bar)
foreign import ccall "static foo.h foo"
f_foo :: BarPtr -> BarPtr
现在我遇到了必须能够使用该功能的问题。 我看到的引用具有类型BarPtr - > IO()的函数,并且与具有签名Stored a => a - >(Ptr a - > IO b) - > IO b的函数一起使用,因为它们在调用主要功能。
不过,我想将这个函数包装在一个库中,得到一个没有IO的Bar - > Bar的函数,是否有可能没有unsafePerformIO ? 什么是程序?
如果不使用unsafePerformIO
,则无法从类型中删除IO
。 但是,在这种情况下,可以使用所需的类型来获得函数,但有一些注意事项。 具体而言,C函数“foo”不能依赖于任何全局变量,线程本地状态或除单个参数之外的任何内容。 此外,调用foo(bar)
应始终在bar
未更改时提供相同的结果。
我期望尝试导入C函数
bar foo(bar input);
与这个电话
f_foo :: BarPtr -> BarPtr
由于结果类型会导致编译器错误。 我认为你可能需要编写一个包装函数(用C语言):
void wrap_foo(bar *barPtr) {
bar outp = foo(*barPtr);
*barPtr = outp;
}
并将其导入为
f_wrap_foo :: BarPtr -> IO ()
最后,您可以使用以下方法调用此导入的函数
fooBar :: Bar -> Bar
fooBar bar = unsafePerformIO $ with bar $ barPtr -> do
f_wrap_foo barPtr
peek barPtr
链接地址: http://www.djcxy.com/p/61183.html
上一篇: FFI and Pointers
下一篇: How to write a pure String to String function in Haskell FFI to C++