嘿,我在理解递归代数类型如何工作以及如何准确使用它们时遇到了一些困难。例如,采用以下自然数的 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。)
事实上,Zero
和 Succ
只是特殊类型的函数(构造函数),它们被声明为创建 Nat
值:
Zero :: Nat
Succ :: Nat -> Nat
与常规函数的区别在于您可以通过模式匹配将它们分开:
predecessor :: Nat -> Nat
predecessor Zero = Zero
predecessor (Succ n) = n
对于递归代数数据类型来说,这没什么特别的,当然,只是代数数据类型;但一个简单的事实是,代数数据类型可以具有与其字段之一相同类型的值,这就是这里创建递归的原因。
关于haskell - 理解函数式编程中的递归代数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956210/