2017-01-20 9 views
0

Hallo alle, so habe ich diese Hausaufgabe in Haskell, wo wir mit dem Nat-Datentyp arbeiten müssen, die nur Zero und Succ(n) für eins gibt. So ist man Succ(Zero), zwei ist Succ(Succ(Zero)) und so weiter. Wir sollten auch addieren, dass diese Datentypen rekursiv multipliziert werden.Verwendung von Rekursion in Haskell

Eines der Probleme aussehen wie dieses

--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 
-- 

Mein Problem ist, wenn ich Rekursion mache ich einen Basisfall, aber wie ich es nenne es gibt nur die Fallbasis und nicht besonders Blase zurück oben.

Hilfe oder Erklärung, wie in Haskell mit Mustervergleich Rekursion würde

EDIT erkannt werden: Der Code Ich habe

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) 

Wo pred eine andere Funktion

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

Zeigen Sie den Code, den Sie bisher haben. – chepner

+1

Wenn es immer nur gibt Ihnen das Ergebnis des Basisfalles, die gerade wiederkehrt wie der Nicht-Basisfall klingt, ohne mit dem Ergebnis, etwas zu tun, aber Sie sollten wirklich Ihren Code zeigen, so können wir sicher sagen. – sepp2k

Antwort

4

hier ist eine Analyse:

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) 

können Sie sehen, dass es ein bisschen mehr klar ist, was falsch ist, wenn man es wieder in gewöhnlichen Algebra übersetzen.

Hinweis: Sie müssen nicht pred nennen, und Sie nicht mehr als zwei Fälle benötigen.

Beachten Sie auch, dass diese seltsame Formatierung:

Succ(pred i) 
Succ(Zero) 

Haskell sollte wie folgt aussehen:

Succ (pred i) 
Succ Zero 
+0

Danke, das war eine gute Antwort, die mich zum Nachdenken gebracht hat – Dringo