首页 文章

SML currying问题

提问于
浏览
1

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

  • 1

    啊,新泽西的标准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)
    

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

    curry 2 = 2 * (2 * 1)
    

    当然是4 .

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

  • 2
    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
    

相关问题