我已经开始使用数据类型,但我对以下内容感到困惑:
data Natural = Zero | Succ Natural
add :: Natural -> Natural -> Natural
add m Zero = m
add m (Succ n) = Succ (add m n)
这是如何加入工作的。我理解Natural 3
由Succ(Succ(Succ 0)))
代表,虽然这对我来说仍然不是100%明确的,即价值自身减少或者是什么。我想了解一步一步的补充。
答案 0 :(得分:5)
在通常的数学符号中,Zero
为0
而Succ
为1 +
。所以:
add m Zero = m
说m + 0 = m
,并且:
add m (Succ n) = Succ (add m n)
说m + (1 + n) = 1 + (m + n)
。因此,在每次递归调用时,+
的第二个参数减少1,直到0的基本情况。例如,假设我们要计算2 + 3
:
add (Succ (Succ Zero)) (Succ (Succ (Succ Zero)))
Succ (add (Succ (Succ Zero)) (Succ (Succ Zero)))
Succ (Succ (add (Succ (Succ Zero)) (Succ Zero)))
Succ (Succ (Succ (add (Succ (Succ Zero)) Zero)))
Succ (Succ (Succ (Succ (Succ Zero))))
或者:
add two three
Succ (add two two)
Succ (Succ (add two one))
Succ (Succ (Succ (add two Zero)))
Succ (Succ (Succ two))
five
假设:
one = Succ Zero
two = Succ one
three = Succ two
four = Succ three
five = Succ four
您还可以将Natural
类型视为不包含值的链接列表,其中length表示数字。然后+
只是这些列表的串联。