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++