Haskell Polyvariadic Функция с вводом-выводом

Возможно ли иметь функцию, которая принимает вызов внешней функции, где некоторые из аргументов внешней функции являются CString и возвращают функцию, которая вместо этого принимает String?

Вот пример того, что я ищу:

 foreign_func_1 :: (CDouble -> CString -> IO())
 foreign_func_2 :: (CDouble -> CDouble -> CString -> IO ())

 externalFunc1 :: (Double -> String -> IO())
 externalFunc1 = myFunc foreign_func_1

 externalFunc2 :: (Double -> Double -> String -> IO())
 externalFunc2 = myFunc foreign_func_2

Я понял, как сделайте это с числовыми типами C. Однако я не могу придумать способ сделать это, позволяющее преобразование строк.

Проблема, кажется, уместна в функциях ввода-вывода, поскольку все, что преобразуется в CStrings, например newCString или withCString, является вводом-выводом.

Вот как выглядит код, просто обрабатывающий преобразование двойников.

class CConvertable interiorArgs exteriorArgs where
   convertArgs :: (Ptr OtherIrrelevantType -> interiorArgs) -> exteriorArgs

instance CConvertable (IO ()) (Ptr OtherIrrelevantType -> IO ()) where
   convertArgs = doSomeOtherThingsThatArentCausingProblems
instance (Real b, Fractional a, CConvertable intArgs extArgs) => CConvertable (a->intArgs) (b->extArgs) where
    convertArgs op x= convertArgs (\ctx -> op ctx (realToFrac x))
9
задан ricree 13 August 2011 в 21:26
поделиться