liuyang1
liuyang1

Reputation: 1725

fractional type is in Haskell

I want to use rational number type instead of factional type in Haskell (or float/double type in C)

I get below result:

8/(3-8/3)=23.999...
8/(3-8/3)/=24

I know Data.Ratio. However, it support (+) (-) (*) (/) operation on Data.Ratio:

1%3+3%3 == 4 % 3
8/(3-8%3) == 24 % 1

I had checked in Racket:

(= (/ 8 (- 3 (/ 8 3))) 24)
#t

What's correct way to ensure 8/(3-8/3) == 24 in Haskell?

Upvotes: 5

Views: 1494

Answers (2)

n. m. could be an AI
n. m. could be an AI

Reputation: 120239

Use an explicit type somewhere in the chain. It will force the entire calculation to be performed with the corrrect type.

import Data.Ratio

main = do
    print $ 8/(3-8/3) == 24
    print $ 8/(3-8/3) == (24 :: Rational)

Prints

False
True

Upvotes: 8

max taldykin
max taldykin

Reputation: 12908

Data.Ratio.numerator and Data.Ratio.denominator return numerator an denominator of the ratio in reduced form so it is safe to compare denominator to 1 to check if ratio is an integer.

import Data.Ratio

eq :: (Num a, Eq a) => Ratio a -> a -> Bool
eq r i = d == 1 && n == i 
  where
    n = numerator r
    d = denominator r

main = print $ (8/(3-8%3)) `eq` 24

Upvotes: 0

Related Questions