2017-01-20 2 views
0

Привет всем, поэтому у меня есть это домашнее задание в Haskell, где мы должны работать с типом Nat Data, который дает только Zero и Succ(n) для одного. Итак, один - Succ(Zero), два - Succ(Succ(Zero)) и так далее. Мы также должны добавить вычитание, чтобы умножить эти типы данных рекурсивно.Использование recursion in haskell

Одна из проблем выглядеть следующим образом

--Add two natural numbers. 
-- 
-- `>>> add one two` 
-- Succ (Succ (Succ Zero)) 
-- 
-- `>>> add Zero one == one` 
-- True 
-- 
-- `>>> add two two == four` 
-- True 
-- 
-- `>>> add two three == add three two` 
-- True 
-- 

Моя проблема, когда я делаю рекурсию У меня есть базовый случай, но, как я это называю это просто возвращает базовый случай и не особенно пузырь назад вверх.

Любой помощь или объяснения о том, как рекурсии в Haskell с сопоставлением с образцом будет оценен

EDIT: код у меня есть

add :: Nat -> Nat -> Nat 
add Zero Zero = Zero 
add Zero (Succ i) = Succ(pred i) 
add (Succ i) Zero = Succ(pred i) 
add (Succ i) (Succ j) = Succ(add i j) 

Где ПРЕД другая функция

pred :: Nat -> Nat 
pred Zero = Zero 
pred (Succ Zero) = Zero 
pred (Succ i) = Succ(pred i) 
+4

Показать код у вас есть до сих пор. – chepner

+1

Если это только когда-либо дает вам результат базового случая, это звучит так, как будто не базовый случай просто повторяется, не делая ничего с результатом, но вы действительно должны показывать свой код, поэтому мы можем точно сказать. – sepp2k

ответ

4

Вот анализ:

add :: Nat -> Nat -> Nat 

-- 0 + 0 = 0, looks good 
add Zero Zero = Zero 

-- 0 + (1 + i) = 1 + (i - 1), wait, what? No. 
add Zero (Succ i) = Succ(pred i) 

-- (1 + i) + 0 = 1 + (i - 1), again, no. 
add (Succ i) Zero = Succ(pred i) 

-- (1 + i) + (1 + j) = 1 + (i + j), no. 
add (Succ i) (Succ j) = Succ(add i j) 

Вы можете видеть, что немного более очевидно, что неправильно, когда вы переводите его обратно в обычную алгебру.

Подсказка: вам не нужно звонить pred, и вам не нужно больше двух случаев.

Также обратите внимание, что это странное форматирование:

Succ(pred i) 
Succ(Zero) 

Haskell должен выглядеть следующим образом:

Succ (pred i) 
Succ Zero 
+0

Спасибо, это был хороший ответ, который заставлял меня думать – Dringo