[Haskell-cafe] CDouble type coercion

SevenThunders mattcbro at earthlink.net
Sun May 14 03:30:43 EDT 2006

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

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

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

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,
    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.

More information about the Haskell-Cafe mailing list