Хаскелл Пеано Числа
Я пытаюсь написать функцию
toPeano :: Int -> Nat
toPeano n =
который превращает целое число в его число Пеано.
У меня есть данные:
data Nat =
Zero |
Succ Nat
deriving Show
Например,
toPeano 0 = Zero
toPeano 1 = Succ Zero
toPeano 2 = Succ (Succ Zero)
и так далее.
Я понятия не имею, как заставить его распечатать Peano Numbers с целым числом. Я никогда не работал с числами Пеано, поэтому любая помощь с этим будет принята с благодарностью!
Спасибо!
2 ответа
Ваш вопрос не ясен, поэтому я начну с преобразования:
toPeano 0 = Zero
toPeano 1 = Succ Zero
toPeano 2 = Succ (Succ Zero)
Это довольно явно. Вы можете определить числа Пеано с помощью простой рекурсии и использовать эту функцию для всех натуральных чисел:
toPeano 0 = Zero
toPeano x
| x < 0 = error "Can not convert a negative number to Peano"
| otherwise = Succ (toPeano (x-1))
Основным здесь является Succ (toPeano (x-1))
- это только вычитает одно из целого числа и добавляет его к конструкции Пеано.
Теперь как насчет другого направления? Ну, каждый раз, когда вы видите "Succ", вы можете просто добавить один:
fromPeano Zero = 0
fromPeano (Succ x) = 1 + fromPeano x -- note this is inefficent but right now we don't care
Печать результатов
Теперь единственное, что вы сказали, было похоже на вопрос:
Я понятия не имею, как заставить его распечатать Peano Numbers с целым числом.
Это не имеет ничего общего с числами Пеано, но в GHCi вы можете просто запустить любую из следующих функций:
> fromPeano (toPeano 5)
5
Или вы можете сделать программу и использовать print
распечатать результаты:
main = print (toPeano 5829)
и использовать GHC для компиляции программы
$ ghc --make myProg.hs
$ ./myProg
Succ (Succ (Succ (...
Будет ли что-то подобное тому, что вы ищете?
toPeano 0 = Zero
toPeano n = Succ $ toPeano (n-1)