AFAICT,此时 c2hs 用户只能编写自己的编组函数。不幸的是,编组器必须是名称,而不是任意表达式,因此您不能fromIntegral . fromEnum
在 c2hs 声明中用作编组器。
目前我自己编写编组器并将它们包含在 .c2hs 文件中。这是我的一个更复杂的绑定中的一些编组器。我发现这种情况withObject
特别令人讨厌,但并没有那么严重,以至于我已经尝试自己修复它。
cIntToEnum :: Enum a => CInt -> a
cIntToEnum = toEnum . fromIntegral
cIntFromEnum :: Enum a => a -> CInt
cIntFromEnum = fromIntegral . fromEnum
cIntConv :: (Integral a, Num b) => a -> b
cIntConv = fromIntegral
cFloatConv :: (Real a, Fractional b) => a -> b
cFloatConv = realToFrac
-- |since c2hs doesn't allow "with" as an input marshaller,
-- withObject is a synonym.
withObject :: Storable a => a -> (Ptr a -> IO b) -> IO b
withObject = with
withFloatArray :: (Storable b, RealFloat b, RealFloat a) =>
[a]
-> (Ptr b -> IO b1)
-> IO b1
withFloatArray = withArray . map (cFloatConv)
可以说,其中许多应该被提取并放入一个公共库中。如果它与 c2hs 包捆绑在一起,那将是完美的(恕我直言,C2HS 模块被过早地删除了)。