1

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

data Nat = Zero | Succ Nat

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

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

4

2 回答 2

3

您可以在这些上进行模式匹配。例如,我们可以通过以下方式减少数字(或Zero在已经存在的情况下返回Zero):

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

因此,这里的模式是Zero,它与Zero值匹配,并且Succ n,因此将n与包装在Succ数据构造函数中的值统一。

如果你想总结两个Nats,你就定义了一个 function add :: Nat -> Nat -> Nat。您可能首先想尝试两个值的数据构造函数的所有可能情况,然后可能希望通过概括子句来改进您的代码。

于 2019-12-12T13:59:54.150 回答
3

您可以mult :: Nat -> Nat -> Nat在不将参数转换为Integerfirst 的情况下实现。什么是乘法?它是重复添加,您可以递归定义:

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

回想一下,这m - 1是由;Nat包裹的值。Succ如果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) = ...
于 2019-12-12T14:31:36.930 回答