나는 pdflib에 FFI를 쓰고있다. Pdflib C API는 다양한 핸들 (document, page, image, font)을 일반 Integer (포인터가 아님)로 반환하거나 가져가는 많은 기능을 가지고 있습니다.newtype Int -> CInt marshaller
내가 실수로 난의 형태로 newtypes의 무리를 생성 함수에 잘못된 PARAM을 통과하지 않도록하기 위해서 :
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 트릭을 사용하여 모든 형식을 마샬링하는 데 하나의 기능을 사용할 수 있습니까? 아니면 여러 가지 새로운 형식에 대해 동일한 기능을 반복해서 작성해야합니까?
편집 : 내 문제를 해결했기 때문에 Don의 대답을 받아 들였습니다.
내가GeneralizedNewtypeDeriving
에 전환 내 newtypes 각각
deriving (Eq, Ord, Num, Enum, Real, Integral)
을 추가하고, 지금은 마샬에 그들 모두를 표준 fromIntegral를 사용할 수 있습니다.
Nathan Howell의 답변도 정확합니다. 나는 그것을 upvoted. 하지만 불행히도 그의 솔루션은 내가 사용하는 c2hs와 같은 FFI 전 처리기를 포기해야 함을 의미합니다.
덕분에, 내가 GeneralizedNewtypeDeriving를 확인할 수 있습니다 :
또는 (7.2.1 이후 사용 가능) 새로운 GHC 제네릭 기능은 newtypes의 일반적인 포장 풀기 및 재 포장을 할 수 있습니다. 나는 c2hs를 사용하고있다. 그리고 비 내장 유형에 대한 마샬 러를 제공해야합니다. 그러므로 내 질문. –