C ライブラリの Haskell ラッパーを作成しようとしています。基礎となる構造体は複雑すぎて明示的な型として表現できず、実際には C 関数間の受け渡し以外には使用しないのでEmptyDataDecls
、GHC に解決してもらうために使用しています。
必要なのは、これらのデータ型のいずれかへのポインターですが、それを使用して作成しようとするalloca
と、データが type ではないと不平を言いStorable
ます。例えば:
{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
module Main where
import Foreign.Marshal.Alloc
import Foreign.Ptr
data Struct
foreign import ccall "header.h get_struct"
get_struct :: Ptr Struct -> IO ()
main = alloca $ \ptr -> get_struct ptr
GHC は、 のインスタンスがないと言って、これをコンパイルしませんStorable Struct
。私はそれを自分で実装できます:
instance Storable Struct where
sizeOf _ = ...
alignment _ = ...
しかし、それは目的を打ち負かすことに近づいています-構造体の内容を気にしないのであれば、そのようなものを定義する必要はありません。
クラスPtr
がStorable
. したがって、呼び出す前にpeek
onを使用することで、目的を達成できます。ptr
get_struct
main = alloca $ \ptr -> do
ptr <- peek ptr
get_struct ptr
ただし、これはハックのように感じます。
Storable
インスタンスを定義せずに空のデータ宣言を考慮する方法はありますか?