round realfrac frominteger from float haskell numbers integer int bignum

haskell - realfrac - ¿Cuál es la diferencia entre Int y Entero?



realfrac haskell (6)

"Entero" es un tipo de precisión arbitraria: mantendrá cualquier número, sin importar cuán grande, hasta el límite de la memoria de su máquina .... Esto significa que nunca tiene desbordamientos aritméticos. Por otro lado, también significa que su aritmética es relativamente lenta. Los usuarios de Lisp pueden reconocer el tipo "bignum" aquí.

"Int" es el entero más común de 32 o 64 bits. Las implementaciones varían, aunque se garantiza que sean de al menos 30 bits.

Fuente: The Haskell Wikilibro . Además, puede encontrar útil la sección Numbers de A Gentle Introduction to Haskell .

En Haskell, ¿cuál es la diferencia entre un Int y un Integer ? ¿Dónde está documentada la respuesta?


El Preludio define solo los tipos numéricos más básicos: enteros de tamaño fijo (Int), enteros de precisión arbitrarios (enteros), ...

...

El tipo de enteros de precisión finita Int cubre al menos el rango [- 2 ^ 29, 2 ^ 29 - 1].

del informe Haskell: http://www.haskell.org/onlinereport/basic.html#numbers



Int es C int, lo que significa que su rango de valores es de -2147483647 a 2147483647, mientras que un rango entero de todo el conjunto Z , es decir, puede ser arbitrariamente grande.

$ ghci Prelude> (12345678901234567890 :: Integer, 12345678901234567890 :: Int) (12345678901234567890,-350287150)

Observe el valor del literal Int.


Un Integer se implementa como un Int# hasta que se vuelve más grande que el valor máximo que puede almacenar un Int# . En ese punto, es un número GMP .


Int está Bounded , lo que significa que puede usar minBound y maxBound para averiguar los límites, que dependen de la implementación, pero que se garantiza que se mantendrán al menos [-2 29 .. 2 29 -1].

Por ejemplo:

Prelude> (minBound, maxBound) :: (Int, Int) (-9223372036854775808,9223372036854775807)

Sin embargo, Integer es una precisión arbitraria, y no Bounded .

Prelude> (minBound, maxBound) :: (Integer, Integer) <interactive>:3:2: No instance for (Bounded Integer) arising from a use of `minBound'' Possible fix: add an instance declaration for (Bounded Integer) In the expression: minBound In the expression: (minBound, maxBound) :: (Integer, Integer) In an equation for `it'': it = (minBound, maxBound) :: (Integer, Integer)