2

我最近开始学习 Haskell,现在在我的课堂上,我们构建了一个 Peano 数字类并将其实例化到 Num 类型类中。

在讲座中,我的教授声称,根据您是否将后继函数视为S x = x + 1S x = 1 + x,乘法定义的适当后继情况会有所不同。分别:

x * S y = x * y + x
x * S y = x + x * y

此外,他声称使用这两种选择中的第一种更可取,因为它更懒惰,但我很难看到这是怎么回事。

我们查看了添加定义的示例

x + S y = S (x + y)

好于

x + S y = S x + y

因为评估x + y == z发生得更快,但我找不到类似的乘法案例。

讲义在这里:http ://cmsc-16100.cs.uchicago.edu/2014/Lectures/lecture-02.php

4

1 回答 1

0

懒惰不是关于速度,而是关于多久可用。

x * S y = x * y + x然后你可以infinity * 2 > 5很快回答,因为它会这样扩展:

infinity * (S (S Z)) > 5
infinity * (S Z) + infinity > 5
infinity * Z + infinity + infinity > 5
infinity + infinity > 5

(从那里剩下的都是微不足道的)

但是,我认为这并不像您的教授所说的那么好!尝试以2 * infinity > 5这种形式主义进行扩展,您会感到失望(或忙了很长时间:-P)。另一方面,对于乘法的其他定义,您确实会得到答案。

现在,如果我们有加法的“好”定义,我认为应该是这样的情况,你可以在一位置得到无穷大的答案。事实上,我检查了一些定义 Nats 的 Haskell 包的来源,确实他们更喜欢x * S y = x + x * y而不是你的教授声称的更好的方式。

于 2015-02-25T04:01:53.853 回答