SML currying问题

时间:2011-02-09 02:51:56

标签: recursion sml currying

我下周会有一个中期即将到来,我正在阅读课堂上提供的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) 

我们应该得到的结果是四,但我不知道我们是如何通过上面的步骤得到这个结果的。

请帮助。感谢您。

2 个答案:

答案 0 :(得分:2)

啊,新泽西州的标准ML,我多么想念你......

无论如何,让我逐步完成这一步。请记住,与我前面的晚餐(偶然是咖喱菜肴)不同,咖喱基本上只是一次处理一个参数以返回新功能的方式。考虑到这一点,将前2个应用于给定的函数。由于只有一种模式匹配,你现在有了一个新功能 - 让我们称它为“咖喱”:

curry n = n * pow 1 n

请注意,您现在有一个要解决的pow函数的“内部”版本。这样做,再次,一个模式匹配。让我们称之为内部咖喱功能“米”:

rice n = n * pow 0 n

还有一个,“虾” - 但这次,其他模式匹配:

shrimp n = 1

这里的递归已经终止,所以你有:

rice n = n * 1
curry n = n * (n * 1)

现在,使用新的pow 2 2功能使用原始curry中的第二个2:

curry 2 = 2 * (2 * 1)

当然是4。

我非常怀疑SML以这种方式命名curried函数,但我希望这有助于理解这个概念。如果它也让你感到饥饿,我不承担任何责任。

答案 1 :(得分:1)

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) = 4