Я пытаюсь создать оболочку Haskell для библиотеки C.Базовые структуры слишком сложны, чтобы их можно было выразить как явные типы, и я фактически не использую их, кроме как для передачи между функциями C, поэтому я использую EmptyDataDecls
, чтобы позволить GHC решить это для меня.
Мне нужен указатель на один из этих типов данных, но когда я пытаюсь создать его с alloca
, он жалуется, что данные не относятся к типу 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
на ptr
перед вызовом get_struct
:
main = alloca $ \ptr -> do
ptr <- peek ptr
get_struct ptr
Это похоже на хак.
Есть лиспособ получить пустые объявления данных для рассмотрения Storable
без определения экземпляра?