Haskell Peano数与乘法中的懒惰

时间:2014-10-01 19:03:05

标签: haskell lazy-evaluation multiplication peano-numbers

我最近开始学习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

1 个答案:

答案 0 :(得分: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,而不是你教授声称更好的方式。