我正在尝试为 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
不定义实例的情况下考虑空数据声明?