Haskell Converting Int to Float

24,158

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
Share:
24,158
Syafiq Kamarul Azman
Author by

Syafiq Kamarul Azman

A bit of data, a bit of ML, a bit of web, a lot of confusion 😵‍💫

Updated on May 16, 2020

Comments

  • Syafiq Kamarul Azman
    Syafiq Kamarul Azman almost 4 years

    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!

  • Syafiq Kamarul Azman
    Syafiq Kamarul Azman about 12 years
    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!
  • rotskoff
    rotskoff about 12 years
    For concision, you don't need to force the type :: Float
  • Landei
    Landei about 12 years
    Using Data.Function.on you can write percent x y = 100 * ((/) 'on' fromIntegral) x y (replace ' by backticks)