我在寫pdfIib給FFI。 Pdflib C API有許多函數返回和/或採用各種句柄(文檔,頁面,圖像,字體)爲純整數(而不是指針)。newtype Int - > CInt marshaller
爲了保證我不小心錯PARAM傳遞給我的形式創建一批newtypes的功能:
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
正如你所看到的marshallers是完全一樣的,只是爲了不同的類型。
所以我的問題是,是否有某種類型的魔術,SYB vodoo技巧,我可以使用只有一個函數來編組所有這些類型,或者是否必須一次又一次地爲不同的newtypes編寫相同的函數?
編輯:我接受唐的回答,因爲它解決了我的問題。
我對
GeneralizedNewtypeDeriving
切換添加
deriving (Eq, Ord, Num, Enum, Real, Integral)
每個我newtypes的,現在我可以使用標準fromIntegral馬歇爾所有的人。
內森豪威爾的答案也是正確的,我upvoted它。但不幸的是,他的解決方案意味着放棄FFI預處理器,如我正在使用的c2hs。
謝謝,我會檢查GeneralizedNewtypeDeriving。我正在使用c2hs。它需要我爲任何非內建類型提供編組器。因此我的問題。 –