Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell-Peano数与乘法中的惰性_Haskell_Lazy Evaluation_Multiplication_Peano Numbers - Fatal编程技术网

Haskell-Peano数与乘法中的惰性

Haskell-Peano数与乘法中的惰性,haskell,lazy-evaluation,multiplication,peano-numbers,Haskell,Lazy Evaluation,Multiplication,Peano Numbers,我最近开始学习Haskell,现在在我的课堂上,我们已经构建了一个Peano数字类,并在Num typeclass中实例化了它 在讲座中,我的教授声称,根据您是将后继函数视为sx=x+1还是sx=1+x,乘法定义的合适后继情况会有所不同。分别为: x * S y = x * y + x x * S y = x + x * y 此外,他声称使用这两个选项中的第一个更可取,因为它更懒惰,但我很难理解这是怎么回事 我们看了一个示例,其中添加了 x + S y = S (x + y) 比 x + S

我最近开始学习Haskell,现在在我的课堂上,我们已经构建了一个Peano数字类,并在Num typeclass中实例化了它

在讲座中,我的教授声称,根据您是将后继函数视为
sx=x+1
还是
sx=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
的速度要快得多,但我找不到类似的乘法情况

这里有课堂讲稿:

懒惰与速度无关,而是与多久能得到什么有关

使用
x*sy=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)。另一方面,对于乘法的另一个定义,你会得到一个答案


现在,如果我们有加法的“好”定义,我认为应该是这样的,你可以得到一个在任意位置都有无穷大的答案。事实上,我检查了几个定义NAT的Haskell包的源代码,事实上,他们更喜欢
x*S y=x+x*y
而不是你教授所说的更好的方式。

你的问题中似乎有很多小错误。我真的不知道如何理解你的第一个问题,因为乘法的定义没有使用后继函数(只有
S
类型构造函数,您不能定义任何不同的构造函数)剩下的我不得不说,在你给出的链接中,我不能比你的教授说得更好——解释很好——也许你可以把你不懂的部分抄出来,我们可以讨论一下,然后就看到了——另一个问题也是家庭作业/练习——提示:与不同类型的多重刺激一样(扩展纸上的定义,看看短些什么)-顺便说一句,这门课看起来真的很好-希望我在我的时代有类似的:)关于第一个问题:我想你应该忘记“1+x”和“x+1”部分,试着弄清楚是
x*y+x
还是
x+x*y
(又名“x*(y+1)”还是“x*(1+y)”更符合你的定义-