我最近开始学习Haskell,现在在我的课堂上,我们构建了一个Peano数字类并在Num类型类中实例化。
在讲座中,我的教授声称,根据您是否将后继函数视为S x = x + 1
或S 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
答案 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
,而不是你教授声称更好的方式。