首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SML currying问题

SML currying问题
EN

Stack Overflow用户
提问于 2011-02-09 10:51:56
回答 2查看 1.7K关注 0票数 1

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

这是一个简单的函数,可以计算一个数的幂。下面是函数定义:

代码语言:javascript
复制
fun pow 0 n = 1 | pow k n = n*pow(k-1)n

当我们向它传递以下参数时,我不确定这个函数是如何工作的:

代码语言:javascript
复制
val x = pow 2 2

这是我的看法:

代码语言:javascript
复制
=2*pow(1)2
=2*(2*pow(0)2)2
=2*(2*(1)2)2) 

我们应该得到的结果是4,但我不明白我们如何从上面执行的步骤中获得这个结果。

请帮帮我。谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-09 11:11:10

啊,新泽西的标准ML,我有多想你...

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

代码语言:javascript
复制
curry n = n * pow 1 n

请注意,您现在有一个“内部”版本的pow函数要寻址。这样做,再一次,有一个模式匹配。让我们将这个内部的curried函数命名为“大米”:

代码语言:javascript
复制
rice n = n * pow 0 n

再来一个“虾”--但这一次,另一个模式匹配:

代码语言:javascript
复制
shrimp n = 1

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

代码语言:javascript
复制
rice n = n * 1
curry n = n * (n * 1)

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

代码语言:javascript
复制
curry 2 = 2 * (2 * 1)

当然是4。

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

票数 2
EN

Stack Overflow用户

发布于 2011-02-09 10:59:13

代码语言:javascript
复制
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。因此,上面的内容应该是:

代码语言:javascript
复制
2*pow(1)2 =2*(2*pow(0)2)

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

代码语言:javascript
复制
2*pow(1)2 = 2*(2*pow(0)2) = 2*(2*1) = 4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4940840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档