在haskell中使用递归

时间:2017-01-20 17:13:28

标签: haskell recursion

大家好,所以我在Haskell做了这个家庭作业,我们必须使用Nat Data类型,只给ZeroSucc(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)

1 个答案:

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