[Haskell-cafe] CDouble type coercion

Robert Dockins robdockins at fastmail.fm
Sun May 14 15:18:27 EDT 2006


On Sunday 14 May 2006 03:00 pm, SevenThunders wrote:
> Thanks that helps a bit.  The realToFrac type coercion works, but
> ultimately it seems
> that printf won't play nice.  Consider this simple haskell code
>
> module Test
> 	where
> import IO
> -- import Data.Array.Storable
> import Text.Printf
> import Foreign.C.Types (CInt, CDouble )
>
> y :: CDouble
> y = 5.2
> u = realToFrac(y)
> test = do  printf "%14.7g" u

Try:

y :: CDouble
y = 5.2
u :: Double
u = realToFrac(y)
test = do  printf "%14.7g" u

The root problem seems to be that GHC isn't sure what type 'u' has unless you 
fix it with a type signature because 'realToFrac' has a polymorphic type.  
I'm not sure why it works when you type it at the interpreter.


> Compiling it into GHCi I get the error,
> test.hs:13:11:
>     No instance for (PrintfType (t t1))
>       arising from use of `printf' at test.hs:13:11-16
>     Probable fix: add an instance declaration for (PrintfType (t t1))
>     In the result of a 'do' expression: printf "%14.7g" u
>     In the definition of `test': test = do printf "%14.7g" u
> Failed, modules loaded: none.
>
> If I replace the printf by a standard print there is no problem.  Also if I
> comment out
> the line with test = ... , it will load (compile) and I can then type in
> the interpreter
> printf "%14.7g" u
> and it works!
>
> but
> printf "%14.7g" y
>
> fails because y is of type CDouble.  At this point I think I'm giving up on
> the
> formatted printing in Haskell.  It's just too persnickety.
> I guess I'll just call printf via C and see what happens.
>
> --
> View this message in context:
> http://www.nabble.com/CDouble-type-coercion-t1615450.html#a4383006 Sent
> from the Haskell - Haskell-Cafe forum at Nabble.com.
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list