Dividir Int por Int y devolver Int

79

Necesito una función que obtenga dos Ints ( ay b) y devuelva A/Bcomo Int. Estoy seguro de que A/Bsiempre será un número entero.

Aquí está mi solución:

myDiv :: Int -> Int -> Int
myDiv a b = 
      let x = fromIntegral a
          y = fromIntegral b
      in truncate (x / y)

Pero quiero encontrar una solución más sencilla. Algo como esto:

myDiv :: Int -> Int -> Int
myDiv a b = a / b

¿Cómo puedo dividir Int a Int y obtener Int?

demas
fuente

Respuestas:

140

¿Por qué no usar quot?

quot a b

es el cociente de números enteros ayb truncado hacia cero.

Puntiagudo
fuente
7
O a `quot` bpara los amantes de los infijos (guau, ¿puedes escapar de las comillas inversas en las comillas inversas con barra invertida?).
38
También a `div` b; si mal no recuerdo, quottrunca (como querían demasiados), y divredondea hacia cero. Entonces (-3) `quot` 4 == 0, y (-3) `div` 4 == -1.
Antal Spector-Zabusky
5
+1 para div. Más matemáticamente educado, quotes una perra cuando hay números negativos alrededor.
luqui
Esto fue un salvavidas para mí. Estaba luchando con fromIntegral (ceiling (int1 / int2))y otras cosas, ninguna de las cuales me devolvió una Int, pero esta sí.
MuffinTheMan
10
divredondea hacia infinito negativo, no cero.
Lacuno
1

Esto es lo que hice para hacer el mío:

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b
Jacob Stewart
fuente
2
Agradable como ejercicio, pero inútil en la producción. En números grandes, es lento (tiempo lineal) y tiene una gran huella de memoria (no recursivo de cola). Para números negativos, es incorrecto ( a<0) o nunca termina ( b<0).
Ruud Helderman