В базовом пакете с версии> = 4.8.0.0, которая входит в GHC 7.10.1 и выше, в настоящее время тип Natural, который делает то, что вы хотите - вы можете просто изменить свой код:
import Numeric.Natural (Natural)
func :: [Natural] -> [Int]
это, однако, ближе к Integer
чем Int
, потому что, как и в отличие от Integer
Int
, он не имеет максимальное значение.
Поскольку Natural
, как Integer
, является экземпляром Num
и Integral
, все те же арифметические операции и функции преобразования доступны, как вы получите с Integer
. Попытки вычислить отрицательный Natural
будут вызывать Underflow
во время выполнения, что является ArithException
. Кроме того, удобно, вы можете создать Natural
используя только целое число буквальным, без преобразования:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :m +Numeric.Natural
Prelude Numeric.Natural> 2 :: Natural
2
Однако, если вы предпочли бы остаться в области целых чисел фиксированного размера, есть решение для этого, тоже - и он был намного длиннее - Word
от the module Data.Word (который также содержит, например, Word8
для 8-битных неотрицательных целых чисел). Вы должны использовать Word
так же, как Natural
.Однако, имейте в виду - что Word
типы молча опустошения, не бросать исключение:
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
Я надеялся, что кто-то показать, как сделать это с типами, но теперь я вижу, что это невозможно - из комментария к класс NonNegative.C в неотрицательном: «Экземпляры этого класса должны обеспечивать неотрицательные значения. Мы не можем применять это по типам, но ограничение класса типа NonNegative.C позволяет избежать случайного использования типов, которые допускают отрицательные числа». Какое разочарование :-) – liwp