【问题标题】:Is it fair to say that Currying is the enabling of partial application?可以说柯里化是部分应用的使能吗?
【发布时间】:2012-10-18 22:44:01
【问题描述】:

对不起,如果这超出了旧范围。我意识到这已经[之前讨论过]What is the difference between currying and partial application?。我仍然希望对术语进行一些澄清。

是否可以说柯里化启用部分应用并且部分应用在没有被柯里化的函数上是不可能的?是否公平地说,在像 Haskell 这样自动支持部分应用程序的语言中,所有函数都是隐式柯里化的?

【问题讨论】:

    标签: partial currying


    【解决方案1】:

    柯里化和部分应用都意味着一种语言支持高阶函数——也就是说,将函数作为数据传递——否则它们将毫无用处,而使用高阶函数,柯里化和部分应用都可以手动实现。

    除上述之外,它们是不同的想法。

    你会说有一个while 循环“启用”forforeach 循环吗?从某种意义上说,这是对的,但它没有告诉您有关循环的任何有用信息。

    部分应用 就是它所说的;你将一个函数应用到它的一些参数上,生成一个只需要剩余参数的专用版本。这可以在有或没有对函数进行柯里化的情况下完成,也许可以使用包装函数来处理参数,如apply_foo_to_baz(baz) = ((bar, quux) => foo(bar, baz, quux));,如果您原谅伪代码的话。

    Currying 意味着将一个接受多个参数的函数(如foo1(bar, baz, quux);)转换为一次应用于单个参数的函数,如foo2(bar)(baz)(quux);。将foo2 应用于较少的参数在技术上不是部分应用,因为该函数只接受一个参数。知道foo2foo1 的柯里化版本,我们可以将foo2(bar) 视为foo1 的部分应用形式,但一般来说,柯里化函数并没有任何东西使它们“部分应用”特定数量的参数。

    就 Haskell 而言,以通常方式定义的函数实际上是 curried 默认情况下(这是合适的,因为两者都以 the same person 命名)。事实上,在不依赖实现细节的情况下,在 Haskell 中有效地定义“部分应用程序”的含义实际上有点棘手。

    【讨论】:

    • 我的结论是,您对我的第二个问题的回答(公平地说,在像 Haskell 这样自动支持部分应用程序的语言中,所有函数都被隐式柯里化了吗?)是“是”。
    • @RussAbbott:更像是“反过来”,但是是的。 Haskell 和类似语言默认使用 curry 东西,因为部分应用更容易(除非你想,比如说,只部分应用第三个参数,呵呵)。
    • 部分应用程序的伪代码示例 [apply_foo_to_baz(baz) = ((bar, quux) => foo(bar, baz, quux))] 听起来部分应用程序没什么特别的。对于任何函数 f(a_param, b_param, c_param),我可以写成 g(f, a_arg) = ((b, c) => f(a_arg, b, c))。 g 所做的只是创建一个函数来存储 a_arg 的值并将其插入到 a_param 调用 f 中。这很有用,但它真的配得上“部分应用”这样的名字吗?没有发生真正的应用。所发生的只是其中一个参数已被缓存。
    • @RussAbbott:嗯,这是一个实现问题——编译器可以优化它,就像它可以提前计算常量算术表达式一样。但除此之外,你是对的——这没什么特别的,假设一种语言完全支持高阶函数。这可能就是为什么这个词和“部分应用”一样无聊的字面意思。
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2012-03-14
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2010-09-18
    相关资源
    最近更新 更多