RosettaCodeData/Task/Map-range/Haskell/map-range.hs

22 lines
814 B
Haskell

import Data.Ratio
import Text.Printf
-- Map a value from the range [a1,a2] to the range [b1,b2]. We don't check
-- for empty ranges.
mapRange :: (Fractional a) => (a, a) -> (a, a) -> a -> a
mapRange (a1,a2) (b1,b2) s = b1+(s-a1)*(b2-b1)/(a2-a1)
main = do
-- Perform the mapping over floating point numbers.
putStrLn "---------- Floating point ----------"
mapM_ (\n -> prtD n . mapRange (0,10) (-1,0) $ fromIntegral n) [0..10]
-- Perform the same mapping over exact rationals.
putStrLn "---------- Rationals ----------"
mapM_ (\n -> prtR n . mapRange (0,10) (-1,0) $ n%1) [0..10]
where prtD :: PrintfType r => Integer -> Double -> r
prtD n x = printf "%2d -> %6.3f\n" n x
prtR :: PrintfType r => Integer -> Rational -> r
prtR n x = printf "%2d -> %s\n" n (show x)