Haskell Converting Int to Float
Asked Answered
C

2

12

I'm having some problem with one of the functions which I'm new at, it's the fromIntegral function.

Basically I need to take in two Int arguments and return the percentage of the numbers but when I run my code, it keeps giving me this error:

Code:

percent :: Int -> Int -> Float
percent x y =   100 * ( a `div` b )
where   a = fromIntegral x :: Float
        b = fromIntegral y :: Float

Error:

No instance for (Integral Float)
arising from a use of `div'
Possible fix: add an instance declaration for (Integral Float)
In the second argument of `(*)', namely `(a `div` b)'
In the expression: 100 * (a `div` b)
In an equation for `percent':
    percent x y
      = 100 * (a `div` b)
      where
          a = fromIntegral x :: Float
          b = fromIntegral y :: Float

I read the '98 Haskell prelude and it says there is such a function called fromInt but it never worked so I had to go with this but it's still not working. Help!

Chimney answered 24/4, 2012 at 17:48 Comment(1)
I doubt the 98 report claims there is a fromInt.Arequipa
C
26

Look at the type of div:

div :: Integral a => a -> a -> a

You cannot transform your input to a Float and then use div.

Use (/) instead:

(/) :: Fractional a => a -> a -> a

The following code works:

percent :: Int -> Int -> Float
percent x y =   100 * ( a / b )
  where a = fromIntegral x :: Float
        b = fromIntegral y :: Float
Capablanca answered 24/4, 2012 at 17:55 Comment(3)
Oh, cheers for the heads up, I have been using div the whole time and forgot to look at the alternative! My bad, thanks again!Chimney
For concision, you don't need to force the type :: FloatTicker
Using Data.Function.on you can write percent x y = 100 * ((/) 'on' fromIntegral) x y (replace ' by backticks)Laryngotomy
L
0

alternatively you can do

precent :: Int -> Int -> Float
percent x y = 100 * ( int(a) / int(b) ) 
  where int = fromIntegral
Limousine answered 27/2, 2022 at 0:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.