Использовать div
, который выполняет целочисленное деление:
halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
| otherwise = x `div` 2 : halfEvens xs
Функция (/)
требует аргументы, тип которых находится в классе Fractional, и выполняет стандартное деление. Функция div
требует аргументов, тип которых находится в классе Integral, и выполняет целочисленное деление.
Точнее, div
и mod
округляются до отрицательной бесконечности. Их кузены, quot
и rem
, ведут себя как целочисленное деление в C и округляются до нуля. div
и mod
обычно правильны при выполнении модульной арифметики (например, при расчете дня недели с учетом даты), тогда как quot
и rem
немного быстрее (я думаю).
Немного поиграть в 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]