C2HS编组双指针

  • 本文关键字:指针 C2HS haskell c2hs
  • 更新时间 :
  • 英文 :


当存在类似的函数时

some_type_t* some_type_create(const char* name, char** errptr);

有没有一种方法可以让C2HS生成具有以下签名的Haskell绑定?

someTypeCreate :: String -> IO (SomeTypeFPtr, String)

到目前为止,我能得到的是:

{#fun some_type_create as ^ 
    {`String', alloca- `Ptr CChar' peek*} -> `SomeTypeFPtr' #}

它的工作方式让我得到

someTypeCreate :: String -> IO (SomeTypeFPtr, (Ptr CChar))

但是我如何使它返回IO (SomeTypeFPtr, String)
(或者更好的IO (Either String SomeTypeFPtr)),因为String表示错误)?

我假设我应该使用/编写一个不同的整理器来使用,而不是peek,它会转换结果类型,但我不太明白如何做到这一点。

我想我已经想通了,我刚刚写了以下整理器:

nullableM :: (Ptr a -> IO b) -> Ptr a -> IO (Maybe b)
nullableM f ptr = if ptr == nullPtr
    then return Nothing
    else liftM Just $ f ptr
{-# INLINE nullableM #-}
toStringMaybe :: CString -> IO (Maybe String)
toStringMaybe = nullableM peekCString 
{-# INLINE toStringMaybe #-}
peekStringMaybe :: Ptr CString -> IO (Maybe String)
peekStringMaybe x = peek x >>= toStringMaybe
{-# INLINE peekStringMaybe #-}

最新更新