下周我有一个期中考试,我只是复习了一下课堂上提供的sml笔记。我遇到了一个令人兴奋的例子,我不确定它是如何工作的。
这是一个简单的函数,可以计算一个数的幂。下面是函数定义:
fun pow 0 n = 1 | pow k n = n*pow(k-1)n当我们向它传递以下参数时,我不确定这个函数是如何工作的:
val x = pow 2 2这是我的看法:
=2*pow(1)2
=2*(2*pow(0)2)2
=2*(2*(1)2)2) 我们应该得到的结果是4,但我不明白我们如何从上面执行的步骤中获得这个结果。
请帮帮我。谢谢你。
发布于 2011-02-09 11:11:10
啊,新泽西的标准ML,我有多想你...
不管怎样,让我一步一步地来看一下。记住,与我面前的晚餐不同(顺便说一句,这是一道菜),currying基本上是一种一次只处理一个参数来返回新函数的方法。考虑到这一点,将前2应用于给定的函数。由于只有一个模式匹配,您现在有了一个新函数--让我们称它为"curry":
curry n = n * pow 1 n请注意,您现在有一个“内部”版本的pow函数要寻址。这样做,再一次,有一个模式匹配。让我们将这个内部的curried函数命名为“大米”:
rice n = n * pow 0 n再来一个“虾”--但这一次,另一个模式匹配:
shrimp n = 1递归已在此处终止,因此您拥有:
rice n = n * 1
curry n = n * (n * 1)现在,在新的curry函数中使用原始pow 2 2中的第二个2:
curry 2 = 2 * (2 * 1)当然是4。
我非常怀疑SML用这种方式命名curried函数,但我希望这能帮助理解这个概念。如果这也让你感到饥饿,我不承担任何责任。
发布于 2011-02-09 10:59:13
2*pow(1)2 =2*(2*pow(0)2)2 在这里,您将pow 1扩展为2 * pow 0 2,并保留它后面的2。这是错误的。pow 1本身会扩展到(fn n => n * pow 0 2),只有当它也应用于第二个参数时,它才会变成2 * pow 0 2。因此,上面的内容应该是:
2*pow(1)2 =2*(2*pow(0)2)现在如果我们应用pow 0 2,我们得到1,所以最终结果是:
2*pow(1)2 = 2*(2*pow(0)2) = 2*(2*1) = 4https://stackoverflow.com/questions/4940840
复制相似问题