Haskell 代数数据类型数据Nat=0 | S Nat

Haskell 代数数据类型数据Nat=0 | S Nat,haskell,Haskell,我们从代数数据类型开始了解。例如,我们有: add :: Nat -> Nat -> Nat add a Zero = a add a (S b) = add (S a) b add' :: Nat -> Nat -> Nat add' a Zero = a add' a (S b) = S (add' a b) 那是什么意思?好吧,加上一个0=a,我想这很清楚。 但是添加a(S b)=添加(S a)b?然后加上“ 非常感谢;) 假设你在教一个只会数数的孩子如何

我们从代数数据类型开始了解。例如,我们有:

add ::  Nat -> Nat -> Nat
add a Zero = a
add a (S b) = add (S a) b

add' ::  Nat -> Nat -> Nat
add' a Zero  = a
add' a (S b) = S (add' a b)
那是什么意思?好吧,加上一个0=a,我想这很清楚。 但是添加a(S b)=添加(S a)b?然后加上“


非常感谢;)

假设你在教一个只会数数的孩子如何加法

第一: 加3和2等于加4和1,等于加5和0,我们知道答案是5

第二:
添加3和2是在添加3和1后查找下一个数字,这是添加3和0后的下一个数字。因此,答案是3加两次。

您在
ghci
中试验过这些吗?这是两种不同的加法实现,因此有两个不同的名称(
add
add'
)。
adda(sb)=add(sa)b
的意思有点像“如果第二个参数非零,则增加第一个参数并减少第二个参数”。如果您将
S
解读为
1+
,那么
sb
就是
1+b
,可能会有所帮助。然后,
adda(1+b)=add(1+a)b
在我看来非常可读,而且
add'a(1+b)=1+(add'ab)