嘿,我在理解递归代数类型如何工作以及如何准确使用它们时遇到了一些麻烦。例如,对自然数采用以下RAT定义:
data Nat = Zero | Succ Nat
我们在这里使用RAT是因为值集必须是无限的,我知道原则是用前一个表达每个新值,但我不明白它是如何形成自然数的。有人会介意清除这个吗?谢谢
答案 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。)
事实上,Zero
和Succ
只是特殊类型的函数(构造函数),它们被声明为创建Nat
值:
Zero :: Nat
Succ :: Nat -> Nat
与常规函数的不同之处在于,您可以使用模式匹配将它们分开:
predecessor :: Nat -> Nat
predecessor Zero = Zero
predecessor (Succ n) = n
这对于递归代数数据类型来说并不是特别的,当然,只是代数数据类型;但是代数数据类型可以具有与其字段之一相同类型的值的简单事实是在此处创建递归。