Por fin luego de mucho luchar hemos encontrado la respuesta de este atolladero que muchos usuarios de nuestra web presentan. Si tienes algún detalle que compartir puedes aportar tu conocimiento.
Solución:
Usar div
que realiza la división de enteros:
halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
| otherwise = x `div` 2 : halfEvens xs
los (/)
La función requiere argumentos cuyo tipo sea de la clase Fractional y realice una división estándar. los div
La función requiere argumentos cuyo tipo sea de la clase Integral, y realiza la división de enteros.
Más precisamente, div
y mod
redonda hacia el infinito negativo. Sus primos, quot
y rem
se comporta como una división entera en C y se redondea hacia cero. div
y mod
suelen ser correctos al hacer aritmética modular (por ejemplo, al calcular el día de la semana dada una fecha), mientras que quot
y rem
son un poco más rápidos (creo).
Jugando un poco en 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]
Acuérdate de que tienes la capacidad de explicar si te ayudó.