Возможно ли иметь функцию, которая принимает вызов внешней функции, где некоторые из аргументов внешней функции являются 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))