Вы пытались http://hackage.haskell.org/package/non-negative ?
Вы можете использовать номеров PEANO , изменяя тип вашей функции на [Peano] -> ...
. Но тогда вам придется добавить конвертацию функций из целых чисел на номера Peano и обратно всякий раз, когда вы вызываете свою функцию.
Или вы можете добавить проверку времени выполнения:
func xs
| any (< 0) xs = error "only non-negative integers allowed as input"
| otherwise = ...
Обратите внимание, что последнее решение делает вашу функцию строгому .
newtype NonNegative a = NonNegative a
toNonNegative :: (Num a, Ord a) => a -> NonNegative a
toNonNegative x
| x < 0 = error "Only non-negative values are allowed."
| otherwise = NonNegative x
fromNonNegative :: NonNegative a -> a
fromNonNegative (NonNegative x) = x
Просто будьте осторожны, чтобы никогда не использовать неотрицательный конструктор напрямую. Это будет легче, если вы поместите это в отдельный модуль и не экспортируете его.
Кроме того, теперь вы можете использовать (карта тональности), чтобы лениво преобразовать список чисел.
Это все равно потребует проверки времени выполнения, где бы вы ни находились необработанные числа.
В качестве альтернативы вы можете использовать Data.word.