如何定义一个函数,该函数采用数据类型的自然数和 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 - 1
是 Succ
包裹的 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) = ...
我仍在学习价值构造函数的工作原理。我阅读了很多有关数据类型及其值构造函数的内容。问题是我从未在实践中见过它们。例如
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 - 1
是 Succ
包裹的 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) = ...