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 был удален немного преждевременно).