Ответ 1
Используйте 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]