gpt4 book ai didi

haskell - 使用 Haskell FFI 来编码(marshal)结构;另外,如何使用 FunPtr

转载 作者:行者123 更新时间:2023-12-04 23:30:09 25 4
gpt4 key购买 nike

我对 haskell 中的 ffi 有一些疑问.

首先,我正在尝试使用 haskell 中的 c 结构。 .

我有一些问题:我有一个类似的结构

struct foo{int a; float b;};
  • 我什么时候可以用 data Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
  • 当我必须通过 peek 和 poke 实现可存储时?

  • 好的,现在有一个关于 FunPtr 的问题
  • 我不知道什么时候用 FunPtr为什么像 Ptr CInt -> IO CInt 这样的正常定义是不足够的?
  • 最佳答案

    编码

    要编码(marshal)结构,您需要使用 Storable类实例来回编码数据,通过 peekpoke .

    有关示例,请参阅上一个答案:How to use hsc2hs to bind to constants, functions and data structures?

    有趣的指针

    FunPtr 仅当您想将函数作为一流值跨过 FFI 边界传递时才需要,而不是调用外部函数。恰恰:

    A value of type FunPtr a is a pointer to a function callable from foreign code. The type a will normally be a foreign type, a function type with zero or more arguments



    一个例子,注册一个回调函数:
    foreign import ccall "stdlib.h &free"
    p_free :: FunPtr (Ptr a -> IO ())

    由于我们要通过 p_free本身是一个 Haskell 函数,我们必须让 Haskell 知道这实际上是一个 C 函数。 FunPtr包装器控制。

    关于haskell - 使用 Haskell FFI 来编码(marshal)结构;另外,如何使用 FunPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6243815/

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