Неотрицательные целые числа [дубликат]

8
задан Don Stewart 18 April 2011 в 18:36
поделиться

4 ответа

4
ответ дан 5 December 2019 в 12:58
поделиться

Вы можете использовать номеров PEANO , изменяя тип вашей функции на [Peano] -> ... . Но тогда вам придется добавить конвертацию функций из целых чисел на номера Peano и обратно всякий раз, когда вы вызываете свою функцию.

Или вы можете добавить проверку времени выполнения:

func xs
  | any (< 0) xs  = error "only non-negative integers allowed as input"
  | otherwise     = ...

Обратите внимание, что последнее решение делает вашу функцию строгому .

1
ответ дан 5 December 2019 в 12:58
поделиться

Страница Wiki на интеллектуальных конструкторах может дать вам некоторую идею.

1
ответ дан 5 December 2019 в 12:58
поделиться
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.

7
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: