FFIをpdflibに書き込んでいます。Pdflib C APIには、さまざまなハンドル(ドキュメント、ページ、画像、フォント)をプレーンな整数(ポインターではない)として返す、または受け取る関数がたくさんあります。
誤って間違ったパラメーターを関数に渡さないようにするために、次の形式で一連のニュータイプを作成します。
newtype PdiDoc = PdiDoc Int
newtype PdiPage = PdiPage Int
newtype PdfImage = PdfImage Int
newtype PdfFont = PdfFont Int
今、私はそれらのタイプのマーシャラーを提供する必要があります。
image2c (PdfImage i) = fromIntegral i
font2c (PdfFont f) = fromIntegral f
pdipage2c (PdiPage i) = fromIntegral i
ご覧のとおり、マーシャラーはまったく同じですが、タイプが異なります。
だから私の質問は、ある種のタイプマジック、SYB vodooトリックがあり、それらすべてのタイプをマーシャリングするために1つの関数だけを持つことができますか、それとも異なるニュータイプに対して同じ関数を何度も作成する必要がありますか?
編集:それが私の問題を解決したので、私はドンの答えを受け入れました。
スイッチを入れました
GeneralizedNewtypeDeriving
追加した
deriving (Eq, Ord, Num, Enum, Real, Integral)
私のニュータイプのそれぞれに、そして今、私はそれらすべてをマーシャルするために標準のfromIntegralを使うことができます。
ネイサンハウエルの答えも正しいものです、私はそれを賛成しました。しかし残念ながら、彼の解決策は、私が使用しているc2hsのようなFFIプリプロセッサをあきらめることを意味します。