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

时间:2012-03-31 13:15:40

标签: haskell recursion functional-programming

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

data Nat = Zero | Succ Nat 

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

1 个答案:

答案 0 :(得分:14)

这表明:

  • Nat是一种类型。

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

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

因此,例如,Succ (Succ Zero)代表2,Succ (Succ (Succ Zero))代表3,Succ (Succ (Succ (Succ Zero)))代表4,依此类推。 (这个定义0和后继自然数的系统称为Peano axioms。)

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

Zero :: Nat
Succ :: Nat -> Nat

与常规函数的不同之处在于,您可以使用模式匹配将它们分开:

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

这对于递归代数数据类型来说并不是特别的,当然,只是代数数据类型;但是代数数据类型可以具有与其字段之一相同类型的值的简单事实是在此处创建递归。