1

下周我有一个期中考试,我刚刚复习了课堂上提供的 sml 笔记。我遇到了一个 currying 的例子,但我不确定它是如何工作的。

这是一个计算数字幂的简单函数。这是函数定义:

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

2 回答 2

2

啊,新泽西的标准机器学习,我多么想念你……

不管怎样,让我一步一步来。请记住,与我面前的晚餐(顺便说一句是咖喱菜)不同,currying 基本上是一种一次只处理一个参数以返回新函数的方法。考虑到这一点,将前 2 个应用于给定函数。由于只有一个模式匹配,你现在有了一个新函数——我们称之为“curry”:

curry n = n * pow 1 n

请注意,您现在有了要处理的 pow 函数的“内部”版本。再次这样做,一个模式匹配。让我们称这个内部咖喱函数为“rice”:

rice n = n * pow 0 n

还有一个,“虾”——但这一次,另一种模式匹配:

shrimp n = 1

递归已在此处终止,因此您有:

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

现在,将原始函数中的第二个 2pow 2 2与新curry函数一起使用:

curry 2 = 2 * (2 * 1)

当然是4。

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

于 2011-02-09T03:11:09.760 回答
1
2*pow(1)2 =2*(2*pow(0)2)2 

在这里,您可以扩展pow 12 * 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)

现在如果我们 apply pow 0 2,我们得到 1 所以最终结果是:

2*pow(1)2 = 2*(2*pow(0)2) = 2*(2*1) = 4
于 2011-02-09T02:59:12.830 回答