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