AFAICT、この時点でc2hsユーザーは独自のマーシャリング関数を作成する必要があります。fromIntegral . fromEnum
残念ながら、マーシャラーは任意の式ではなく名前である必要があるため、c2hs宣言内でマーシャラーとして使用することはできません。
現在、私はマーシャラーを自分で作成し、.c2hsファイルに含めています。これが私のより複雑なバインディングの1つからのマーシャラーです。特にかじりの状況を見つけました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パッケージにバンドルされていれば、それは完璧でしょう(IMHO C2HSモジュールは少し時期尚早に削除されました)。