[Haskell-beginners] how to print a floating-point number?

Daniel Fischer daniel.is.fischer at web.de
Thu Jan 8 13:28:59 EST 2009


Am Donnerstag, 8. Januar 2009 17:45 schrieb Sergei Winitzki:
> Subject: how to print a floating-point number?
> hi,
>
> I am very new to Haskell. I am trying to benchmark the CPU time needed
> for a computation, and I can't figure out how to print a
> floating-point number.
>
> My code is as follows, and I expected it to work:
>
> import System.CPUTime
> main = do
>        let result = some_computation
>        print result
>        time <- getCPUTime          -- this is an Integer that needs
> to be divided by 1e12 to get time in seconds
>        print (time / 1.0e12)           -- I want this to print a
> floating-point number
>

You have to convert the Integer to a floating point number first, use

fromInteger
or
fromIntegral

for that. Haskell does not do automatic conversion between numeric types.

>
> But this does not compile.
> Error message:    No instance for (Fractional Integer)
>      arising from use of `/' at fact1.hs:18:15-28
>    Possible fix: add an instance declaration for (Fractional Integer)
>    In the first argument of `print', namely `(time1 / 1.0e12)'
>
>  I thought this should work because e.g. 12 / 7 evaluates to
> 1.7142857142857142 in ghci.

That is because numeric *literals* are polymorphic, as they are parsed as e.g. 
"fromInteger 12" if it's an integer literal or "fromRational 3.24" if it's a 
non-integer literal.

> I understand this is some problem with types, but surely it is fixed
> not by adding any instance declarations but perhaps by using some
> Prelude or Numeric function. But which one?
>  I tried everything I could find in the documentation: showFloat,
> adding ::Float everywhere, adding fromIntegral, etc.etc. - nothing
> works. All the books and the tutorials I looked at seem to discuss at
> length such nice things as Fibonacci numbers and recursive factorial
> functions rather than a practical problem like this.

When you are looking for a function, it's a good idea to ask hoogle 
(http://haskell.org/hoogle/) for a function of appropriate type. Asking for a 
function Integer -> Double, the abovementioned are results 1 and 3.
>
> help will be much appreciated!
>
> Sergei

HTH,
Daniel



More information about the Beginners mailing list