【问题标题】:SML currying questionSML 柯里化问题
【发布时间】:2011-02-09 11:11:09
【问题描述】:

下周我有一个期中考试,我正在复习课堂上提供的 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) 

我们应该得到的结果是四,但我看不出我们是如何从上面执行的步骤中得到这个结果的。

请帮忙。谢谢。

【问题讨论】:

  • 哇,谁投票结束了这个? “无关”?真的吗?也许我们只被允许讨论命令式语言?
  • @jalf 我的咖喱双关语可能太难吃了。太多咖喱可能是一件坏事。

标签: recursion sml currying


【解决方案1】:

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

不管怎样,让我一步一步来。请记住,与我面前的晚餐(顺便说一句是咖喱菜)不同,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)

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

curry 2 = 2 * (2 * 1)

当然是 4。

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 2013-01-13
      • 2013-10-04
      • 1970-01-01
      • 2017-06-09
      • 2019-05-21
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      相关资源
      最近更新 更多