[Haskell-cafe] CDouble type coercion
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
> 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
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,
> 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!
> printf "%14.7g" y
> fails because y is of type CDouble. At this point I think I'm giving up on
> 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
More information about the Haskell-Cafe