gpt4 book ai didi

Haskell - FFI 和指针

转载 作者:行者123 更新时间:2023-12-03 12:24:29 25 4
gpt4 key购买 nike

我使用 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

现在我有一个问题,我必须能够使用该功能。 references我看到有 类型的函数BarPtr -> IO () 并使用了 , 签名为 可存储 a => a -> (Ptr a -> IO b) -> IO b ,这没关系,因为他们在 main 中调用函数。

但是,我想将这个函数包装在一个库中,得到一个类型为 的函数。酒吧 -> 酒吧 没有IO,可以不用 吗? unsafePerformIO ?程序是什么?

最佳答案

无法删除 IO从不使用 unsafePerformIO 的类型.但是,在这种情况下,可以获得具有您想要的类型的函数,但有一些注意事项。具体来说,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

关于Haskell - FFI 和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com