2017-01-20 11 views
0

こんにちはすべて私はハスケルでこの宿題を割り当てています。ここではNatデータ型で作業する必要があります。これはZeroSucc(n)です。したがって、1つはSucc(Zero)、2つはSucc(Succ(Zero))などです。また、これらのデータ型を再帰的に掛ける減算を追加することになっています。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をいただければ幸いです。私が持っているコードはPREDが別の関数

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

ですここに分析があります:

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に電話する必要はなく、2つ以上のケースは必要ありません。

Succ(pred i) 
Succ(Zero) 

Haskellは次のようになります:

Succ (pred i) 
Succ Zero 
+0

ありがとうございました – Dringo