haskell - 理解函数式编程中的递归代数类型

标签 haskell recursion functional-programming

嘿,我在理解递归代数类型如何工作以及如何准确使用它们时遇到了一些困难。例如,采用以下自然数的 RAT 定义:

data Nat = Zero | Succ Nat 

我们在这里使用 RAT 是因为值的集合需要是无限的,而且我知道原则是用前一个值来表达每个新值,但我不明白这是如何形成自然数的。有人介意清理这个吗?谢谢

最佳答案

这表明:

  • Nat 是一种类型。

  • Zero 的类型为 Nat。这代表自然数 0。

  • 如果 n 的类型为 Nat,则 Succ n 的类型为 Nat。这代表自然数n+1。

所以,例如,Succ (Succ Zero) 代表 2,Succ (Succ (Succ Zero)) 代表 3,Succ (Succ (Succ ( Succ 零))) 代表 4,依此类推。 (这种从 0 开始定义自然数及其后继数的系统称为 Peano axioms。)

事实上,ZeroSucc 只是特殊类型的函数(构造函数),它们被声明为创建 Nat值:

Zero :: Nat
Succ :: Nat -> Nat

与常规函数的区别在于您可以通过模式匹配将它们分开:

predecessor :: Nat -> Nat
predecessor Zero = Zero
predecessor (Succ n) = n

对于递归代数数据类型来说,这没什么特别的,当然,只是代数数据类型;但一个简单的事实是,代数数据类型可以具有与其字段之一相同类型的值,这就是这里创建递归的原因。

关于haskell - 理解函数式编程中的递归代数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956210/

相关文章:

haskell - Yesod 的莎士比亚模板(哈姆雷特)和 IO

c++ - 递归硬币找零C++

java - 递归链表反转器

javascript - 如何使用 window.setTimeout() 在 JavaScript 中编写递归方法?

functional-programming - ocaml中 "equal (=)"和 "identical (==)"有什么区别?

javascript - 使用 Reduce 将数组转换为对象

haskell - "standardised"是什么意思,为什么是 Haskell 呢?

algorithm - Haskell - C 堆栈溢出

haskell - Haskell 的多态风格是什么?

haskell - 无法构造无限类型