如何定义一个函数,该函数采用数据类型的自然数和 return 它们的总和?

How to define a function that takes natural numbers of a data type and return their sum?

我仍在学习价值构造函数的工作原理。我阅读了很多有关数据类型及其值构造函数的内容。问题是我从未在实践中见过它们。例如

data Nat = Zero | Succ Nat

现在,如果我们想定义一个函数,它接受 Nat 和 returns 乘积的两个输入,我们该怎么做?如果我们想使用运算符 *,我们必须将它们转换为 Haskell 积分。 如果我们想实现一个 mult 函数,它需要两个 Nat,应该将它们相乘而不将它们转换为 Haskel Integrals,那会是什么样子?

我真的还没有得到数据类型|值构造函数。谁能从上面的数据 Nat 示例中说明如何正确使用此类值构造函数?

您可以对这些进行模式匹配。例如,我们可以减少数字(或 return Zero,以防它已经是 Zero):

dec :: Nat -> Nat
dec <b>Zero</b> = Zero
dec <b>(Succ <i>n</i>)</b> = n

这里的模式是 Zero,匹配 Zero 值,Succ n,因此将 n 与包裹在 [= 中的值统一16=]数据构造函数。

如果你想求和两个Nat,你定义一个函数add :: Nat -> Nat -> Nat。您首先可能想尝试所有可能的情况,以获取两个值的数据构造函数,然后可能希望通过概括这些子句来改进您的代码。

您可以实现 mult :: Nat -> Nat -> Nat 而无需先将参数转换为 Integer。什么是乘法?是重复加法,可以递归定义:

n * 0 == 0
n * m == n + n * (m - 1)

回想一下,m - 1Succ 包裹的 Nat 的值;如果 m == Succ k,则 k 表示 m - 1。考虑到这一点,您应该能够看到如何定义 mult,假设您有可用的 add :: Nat -> Nat -> Nat 定义。

mult :: Nat -> Nat -> Nat
mult n Zero = ...
mult n (Succ m) = ...

add :: Nat -> Nat -> Nat可以类似定义,使用基于重复递增的定义。

-- n + 0 = n
-- n + m = (n + 1) + (m - 1)
def add :: Nat -> Nat -> Nat
add n Zero = ...
add n (Succ m) = ...