1

次のような関数がある場合:

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

次の署名を持つ Haskell バインディングを生成する C2HS を取得する方法はありますか?

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と思いますが、その方法がよくわかりません。

4

1 に答える 1

1

I think I've figured it out, I just wrote the following marshallers:

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 #-}
于 2016-04-15T06:23:29.613 に答える