2011-02-09 124 views
1

我有一个中期的下周即将到来,我只是在课堂上提供的sml笔记。我遇到了一个酷热的例子,我不确定它是如何工作的。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

哇,谁投票结束了这个? “无关”?真?也许我们只允许讨论命令式语言? – jalf 2011-02-09 06:26:38

回答

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 2curry功能使用第二个2:

curry 2 = 2 * (2 * 1) 

这当然是4

我很怀疑SML名这样的咖喱功能,但我希望这确实有助于理解这个概念。如果它也让你感到饥饿,我不承担任何责任。

1
2*pow(1)2 =2*(2*pow(0)2)2 

这里展开pow 12 * pow 0 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