Рекурсивные типы данных в sml

Есть ли способ определить тип данных для целых чисел. то есть 0,1,2,... не ноль, один,... индивидуально.

Я хочу определить набор целых чисел. bu с использованием 0, n, n+1 с рекурсией. Я пробовал что-то вроде этого: тип данных nat=0|n|n+1 . Но было почти очевидно, что он не работает, потому что он не распознает 0 как целое число, верно?

Буду признателен за любую помощь.


person 700resu    schedule 25.10.2012    source источник


Ответы (1)


Поскольку множество натуральных чисел счетно бесконечно, вы не можете перечислить все случаи.

Вы можете концептуально представить натуральные числа с помощью чисел Пеано:

datatype peano = Zero | Succ of peano

Тип данных очень прост, он определяет только 0 и гарантирует, что каждое натуральное число имеет преемника. Например, 2 на самом деле представляется как Succ (Succ Zero).

fun count Zero = 0
  | count (Succ p) = 1 + count p

Используя аналогичные методы, вы можете создавать функции add, sub, mult, как и с натуральными числами.

person pad    schedule 25.10.2012
comment
Да, но мне нужно использовать тип данных, который использует 0,1,2,3, а не succ(succ(succ(zer0))). Так могу ли я принять это как нет, невозможное для бесконечных 0,1,2,... ? - person 700resu; 25.10.2012
comment
@ user1710036 Зачем вам это представление, если вы не возражаете против моего вопроса? - person waldrumpus; 26.10.2012
comment
Зачем вам это представительство? Это не представительство. Я хочу иметь тип данных для натуральных чисел. Это все. И я не хочу вводить succ(succ(succ(succ(0))))), что утомительно. - person 700resu; 27.10.2012