大家好,所以我在Haskell做了这个家庭作业,我们必须使用Nat Data类型,只给Zero
和Succ(n)
一个。一个是Succ(Zero)
,两个是Succ(Succ(Zero))
,依此类推。我们还应该递归地将这些数据类型相加。
其中一个问题是这样的
--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中递归的任何帮助或解释都将不胜感激
编辑:我的代码是
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是另一个功能
pred :: Nat -> Nat
pred Zero = Zero
pred (Succ Zero) = Zero
pred (Succ i) = Succ(pred i)
答案 0 :(得分: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