Haskell FFI 中的外部初始化
External initialization in Haskell FFI
我在Haskell中写了一个库,其中有一些参数必须初始化,但在执行过程中永远不会改变。例如:
initialize :: CInt -> CPtr CInt -> IO ParameterData
但是,ParameterData
是一种复杂的数据类型,每次我需要它时构建它的成本太高。我如何设置程序,以便当 C 代码调用初始化函数时,它计算一个 ParameterData
并将其设置为常量,以便 Haskell 库的其余部分可以访问?
整理评论。
在Haskell代码中,将初始化函数写成
initialize :: CInt -> Ptr Int -> IO (StablePtr ParameterData)
并将稳定指针传递给每个函数(如果可以的话,编写一个包装器来提取内容)。
在 C 代码中,将 StablePtr
存储为全局状态,并将其传递给任何需要它的 Haskell 函数。
我在Haskell中写了一个库,其中有一些参数必须初始化,但在执行过程中永远不会改变。例如:
initialize :: CInt -> CPtr CInt -> IO ParameterData
但是,ParameterData
是一种复杂的数据类型,每次我需要它时构建它的成本太高。我如何设置程序,以便当 C 代码调用初始化函数时,它计算一个 ParameterData
并将其设置为常量,以便 Haskell 库的其余部分可以访问?
整理评论。
在Haskell代码中,将初始化函数写成
initialize :: CInt -> Ptr Int -> IO (StablePtr ParameterData)
并将稳定指针传递给每个函数(如果可以的话,编写一个包装器来提取内容)。
在 C 代码中,将 StablePtr
存储为全局状态,并将其传递给任何需要它的 Haskell 函数。