Haskell c2hs趣味编组

Haskell c2hs趣味编组,haskell,Haskell,我正在使用c2hs对ffi进行绑定。我有一个数据类型AiScene,定义如下(细节不重要): 现在,我尝试为以下函数编写绑定: const aiScene* aiImportFile( const char* pFile, unsigned int pFlags); 这就是我到目前为止所做的: {#fun aiImportFile as ^ {`String', cFromEnum `SceneFlags'} -> `AiScene' peek*#} 不幸的是,

我正在使用
c2hs
对ffi进行绑定。我有一个数据类型
AiScene
,定义如下(细节不重要):

现在,我尝试为以下函数编写绑定:

const aiScene* aiImportFile( 
    const char* pFile, 
    unsigned int pFlags);
这就是我到目前为止所做的:

{#fun aiImportFile as ^
  {`String', cFromEnum `SceneFlags'} -> `AiScene' peek*#}
不幸的是,我得到一个类型错误

Couldn't match expected type `AiScene' against inferred type `()'
  Expected type: IO AiScene
  Inferred type: IO ()
现在,如果我进入生成的源并更改类型:

aiImportFile'_ :: ((Ptr CChar) -> (CUInt -> (IO (Ptr ()))))      -- original
aiImportFile'_ :: ((Ptr CChar) -> (CUInt -> (IO (Ptr AiScene)))) -- fixed
然后问题就消失了。如何让
c2hs
自动执行此操作/我做错了什么

谢谢


编辑:我忘记提到的一件事是,我已经为
AiScene

社区wiki答案定义了一个
Storable
实例,并为后代提供了解决方案:


我定义了以下内容:
with'xy=with x(y.castpr)
peek'=peek。castPtr
和类型错误消失

您的封送员使用c2hs-0.16.2和OS X 10.6为我工作。你使用的是什么版本的c2hs?@John有趣。我也在使用0.16.2,但是是在Linux上。我想知道是什么问题。与阴谋集团有关?我不认为这与阴谋集团有关。似乎外国进口的呼吁是错误的,这很奇怪。我想知道在CPP过程中头文件是否被屏蔽了?运行
c2hs--keep
并检查
aiImportFile
的声明是否正确。您也可以尝试使用
{#call…#}
而不是函数挂钩,并手动编写封送包装器。@John当我运行
c2hs--keep
时,
有趣。I
aiImportFile
声明与头文件中显示的完全相同。如果我决定放弃并使用
call
,那么我想我将切换到hsc2hs。这将是不幸的,因为唯一的问题是单指针类型。@John好的,我想我现在已经解决了。我定义了以下内容:
with'xy=with x(y.castpr)
peek'=peek。castPtr
和类型错误消失。我想找到根本原因,但现在应该这样做(我还没有实际测试过)。谢谢你的帮助!
aiImportFile'_ :: ((Ptr CChar) -> (CUInt -> (IO (Ptr ()))))      -- original
aiImportFile'_ :: ((Ptr CChar) -> (CUInt -> (IO (Ptr AiScene)))) -- fixed