Haskell FFI双指针参数

Haskell FFI双指针参数,haskell,ffi,Haskell,Ffi,我想用以下符号包装一组C函数: ErrorCode Initialize(int *argc,char ***args, ...) FFI调用中如何表示双指针?它是指向字符串列表的指针;以下说法可信吗 foreign import ccall unsafe "lib.h Initialize" c_initialize :: Ptr CInt -> Ptr [String] -> IO (Ptr CInt

我想用以下符号包装一组C函数:

ErrorCode Initialize(int *argc,char ***args, ...)
FFI调用中如何表示双指针?它是指向字符串列表的指针;以下说法可信吗

foreign import ccall unsafe "lib.h Initialize"
    c_initialize :: Ptr CInt 
                 -> Ptr [String]
                 -> IO (Ptr CInt)
或者第二个参数是
Ptr(ptrchar)
?到目前为止,我在阅读的文献(现实世界的Haskell和Wikibook)中找不到这个案例,我的C有点生疏。 提前谢谢

--更正: RWH实际上显示了到
pcre\u compile()
的接口:

对应于:

-- pcre.h
pcre *pcre_compile(const char *pattern,
               int options,
               const char **errptr,
               int *errofset,
               const unsigned char *tableptr);

因此,考虑到所有这些建议,似乎最合适的签名是

foreign import ccall unsafe "lib.h Initialize"
c_initialize :: Ptr CInt 
             -> Ptr (Ptr CString)
             -> IO (Ptr CInt)

谢谢大家!!将让您随时发布

可能是一个
Ptr(Ptr(Ptr CChar))
,因为我们在
args
前面有三个
*
(并且
CChar
不是
Char
)。我认为从C类型到Haskell FFI类型的转换非常简单<代码>字符***是
Ptr(Ptr(Ptr-CChar))
。据我所知,没有办法生产或消费
Ptr[String]
(castPtr除外),因为
[String]
不可存储。因此,让你的函数接受一个
Ptr[String]
是相当愚蠢的——你永远不能从Haskell那里调用它,除非你有其他FFI函数专门用于创建一个
Ptr[String]
用于c_initialize。提示:一个
char*
通常是一个
CString
foreign import ccall unsafe "lib.h Initialize"
c_initialize :: Ptr CInt 
             -> Ptr (Ptr CString)
             -> IO (Ptr CInt)