haskell - 自然数作为递归数据类型

标签 haskell recursive-datastructures

我已经开始使用数据类型,但我对以下内容感到困惑:

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% 清楚该值是自行减少还是什么。我想了解一步一步的加法。

P.S:这摘自 Richard Bird 的《函数式编程简介》一书。

最佳答案

在通常的数学符号中,00Succ1 +。所以:

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 类型视为不包含值的链表,其中长度表示数字。那么 + 只是这些列表的串联。

关于haskell - 自然数作为递归数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33851287/

相关文章:

haskell - 在 Haskell 中以树状结构打印二叉搜索树

python - 在 Python 中展平通用 JSON 字典列表或列表

python - 二叉树遍历函数依赖于Steps,所以不能多次运行?

haskell - 如何动态分配循环数据?

haskell - 使用类型同义词的函数定义是 "less polymorphic than expected"

haskell - 在复制其余字段的同时分配记录中的单个字段的简写方法?

f# - 如何在F#中初始化相互递归记录

haskell - Warp/Scotty 在请求结束时未终止线程/资源

haskell - 如何获取 Haskell 列表中元素的索引