
I am new to Haskell and found myself in a bind concerning the use of the C types, CDouble in particular. I extract a CDouble via it's pointer from a StorableArray. Since the array must interface with C the elements of the array must be CDouble. Now I'd like to use Text.Printf to format print statements of elements of the array, but Text.Printf requires Doubles as inputs and so far I have not found an obvious way to coerce CDoubles into Doubles. Additionally, withStorableArray returns a monad containing a CDouble instead of Double as peek I suppose does. Because I cant coerce my CDouble into a Double, printf chokes. Thus the following code fails to compile on GHC import Foreign import Foreign.C import Foreign.C.Types (CInt, CDouble ) import Data.Array.Storable import Text.Printf foreign import ccall "matrix_c.h sumarr" sumarr :: Ptr CDouble -> IO (CDouble) main = do arr <- newListArray (1 , 3) [3,2,1]:: IO (StorableArray Int CDouble) -- extract the pointer to arr withStorableArray arr sumarr >>= (\x -> printf "15.7f\n" x) The error message is, test2.hs:13:44: No instance for (PrintfArg CDouble) arising from use of `printf' at test2.hs:13:44-49 Probable fix: add an instance declaration for (PrintfArg CDouble) In a lambda abstraction: \ x -> printf "15.7f\n" x In the second argument of `(>>=)', namely `(\ x -> printf "15.7f\n" x)' In the result of a 'do' expression: (withStorableArray arr sumarr) >>= (\ x -> printf "15.7f\n" x) -- View this message in context: http://www.nabble.com/CDouble-type-coercion-t1615450.html#a4378492 Sent from the Haskell - Haskell-Cafe forum at Nabble.com.