En el paquete base de la versión> = 4.8.0.0, que se incluye en GHC 7.10.1 y por encima, ahora hay un tipo Natural el que hace lo que quiere - usted puede cambiar el código para:
import Numeric.Natural (Natural)
func :: [Natural] -> [Int]
es, sin embargo, más cerca de Integer
que a Int
, porque al igual que Integer
ya diferencia de Int
, no tiene valor máximo.
Debido Natural
, como Integer
, es una instancia de Num
y Integral
, todas las mismas operaciones aritméticas y las funciones de conversión están disponibles como se obtiene con Integer
. Los intentos de calcular un Natural
negativo lanzarán un Underflow
en tiempo de ejecución, que es un ArithException
. Además, convenientemente, puede crear un Natural
utilizando sólo un literal entero, sin una conversión:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :m +Numeric.Natural
Prelude Numeric.Natural> 2 :: Natural
2
Sin embargo, si usted prefiere permanecer en el dominio de los números enteros de tamaño fijo, no es una solución para eso, también - y ha estado por mucho más tiempo - Word
desde the module Data.Word (que también contiene, por ejemplo, Word8
para enteros no negativos de 8 bits). Utilizaría Word
de la misma manera que Natural
.Sin embargo, se advirtió - los Word
tipos van en silencio desbordamiento, sin lanzar una excepción:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :m +Data.Word
Prelude Data.Word> 2 :: Word
2
Prelude Data.Word> it - 4
18446744073709551614
que la esperanza de que alguien podría mostrar cómo hacer esto con los tipos, pero ahora puedo ver que esto es imposible - a partir de la observación de la clase de tipo NonNegative.C en no negativo: "Las instancias de esta clase deben garantizar valores no negativos. No podemos aplicar esto por tipos, pero la restricción de clase de tipo NonNegative.C evita el uso accidental de tipos que permiten números negativos". Que decepcionante :-) – liwp