我正在尝试在我的C代码中使用Haskell库。我要使用的Haskell函数具有类型String -> IO [Reference]
,其中Reference
是一个相当复杂的结构(详见此处)。
根据阅读各种文档的经验,似乎我需要将这种类型设为Storable
的实例,并且还必须在我的C代码中定义类似的结构才能访问它。对于这样一种复杂的类型来说,这似乎需要做很多非常重复的工作。是否有一种自动化的方式?如何做到这一点?
Reference
作为不透明类型(通过Foreign.StablePtr)导出可能更容易,然后导出获取器函数以访问各个字段。Foreign.Marshal.Array.newArray
或类似的东西。 - Yuras所以这个:
data Test = Test [MyStruct] Int
data MyStruct = MyStruct Int
在C语言中,它的写法如下:
struct MyStruct {
int x;
}
struct ArrayStruct {
MyStruct** array;
int count;
}
struct Test {
ArrayStruct* arr_str;
int y;
}
$(makeStorable ''YourType)
data Type1 = Type1 Int Float
data Type2 = Type2 Int Type1
那么您需要为每个数据类型生成可存储实例:
$(makeStorable ''Type1)
$(makeStorable ''Type2)
还需注意,您必须在生成Storable实例之前先声明数据类型(这是由于TH引起的)。 因此,以下代码将无法正常工作:
$(makeStorable ''Wrong)
data Wrong = Wrong Int
这绝对不是万无一失的,对于简单应用来说已经足够了,但是如果你要处理更复杂的代码,事情很容易出错。
FieldMarshal.hs:(172,1)-(176,61): Non-exhaustive patterns in function makeDataType
的错误提示。 - Jakub Hampl
Storable
实例。 - gspr