我正在将 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 技巧,我可以使用只有一个函数来编组所有这些类型,还是我必须一次又一次地为不同的新类型编写相同的函数?
编辑:我接受了唐的回答,因为它解决了我的问题。
我打开了
GeneralizedNewtypeDeriving
添加
deriving (Eq, Ord, Num, Enum, Real, Integral)
到我的每个新类型,现在我可以使用标准 fromIntegral 来编组所有这些。
Nathan Howell 的回答也是正确的,我赞成。但不幸的是,他的解决方案意味着放弃像我正在使用的 c2hs 这样的 FFI 预处理器。