I\'m making a function in Haskell that halves only the evens in a list and I am experiencing a problem. When I run the complier it complains that you can\'t perform division
I should add that using map
would simplify the code.
HalfIfEven n
| even n = n `div` 2
| otherwise = n
halfEvens = map halfIfEven
Use div, which performs integer division:
halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
| otherwise = x `div` 2 : halfEvens xs
The (/) function requires arguments whose type is in the class Fractional, and performs standard division. The div
function requires arguments whose type is in the class Integral, and performs integer division.
More precisely, div
and mod
round toward negative infinity. Their cousins, quot
and rem
, behave like integer division in C and round toward zero. div
and mod
are usually correct when doing modular arithmetic (e.g. when calculating the day of the week given a date), while quot
and rem
are slightly faster (I think).
Playing around a bit in GHCi:
> :t div
div :: Integral a => a -> a -> a
> :t (/)
(/) :: Fractional a => a -> a -> a
> 3 / 5
0.6
> 3 `div` 5
0
> (-3) `div` 5
-1
> (-3) `quot` 5
0
> [x `mod` 3 | x <- [-10..10]]
[2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1]
> [x `rem` 3 | x <- [-10..10]]
[-1,0,-2,-1,0,-2,-1,0,-2,-1,0,1,2,0,1,2,0,1,2,0,1]