【问题标题】:Is there a name for this partial-application--like functional programming technique?这种类似部分应用程序的函数式编程技术有名称吗?
【发布时间】:2011-06-02 16:24:10
【问题描述】:

我有一个函数 f: (a, b, c = 5, d = 0) -> {...},它接受 2 到 4 个参数。

我想传递这个函数的“绑定”版本,它总是对最后一个参数使用默认值,但对前两个参数使用特定值(比如 1 和 2)。也就是说,我要g: () -> f(1, 2)

如果我要进行部分申请,我会得到g': (c = 5, d = 0) -> f(1, 2, c, d)。也就是说,部分应用不会强制执行我想要的 g 的零参数性质,而是给我 g' 接受 0 到 2 个参数。

如果有的话,从f 获取g 的技术是什么?

【问题讨论】:

  • f 已经有了默认参数,那么为什么不使用柯里化 g: () -> f(1, 2) 呢?
  • 我不明白这个问题与柯里化有何关系。您描述的问题似乎与使函数接受一个参数并返回另一个函数无关,这就是柯里化。
  • 正如@murgatroid99 指出的那样,这与柯里化无关......我认为你的意思是“部分应用”,这是很多人与柯里化混淆的东西。我不知道您所描述的技术的具体名称。
  • @murgatroid99, @pelotom:你们是对的,我说的是部分应用,而不是柯里化。好尴尬-_-。
  • @Matt Ball 我不明白你的意思。我希望g 接受 0 个参数,而不是介于 0 和 2 之间。

标签: functional-programming partial-application


【解决方案1】:

发表我的评论作为答案:似乎这个问题与函数式编程或柯里化或部分应用程序几乎没有关系,而恰恰是关于采用一个采用具有默认值的可选参数的函数,并使用没有固定默认参数的可选参数。

将此概念转换称为T。假设由于某种原因,部分应用意味着可选参数仍然是可选的(它不需要是通用的,但话又说回来,熟悉的函数式编程语言 - Haskell 等 - 甚至没有可选参数),从f 获取g 至少有两种方法。

    • f: (a, b, c = 5, d = 0) -> {....} 为例,它需要 2 到 4 个参数。
    • 生成新函数T(f) : (a,b) -> {...},它正好需要两个参数。即T(f)(a,b) = f(a,b) = f(a,b,5,0)
    • 现在对 T(f) 进行部分应用,将其两个参数固定为 1 和 2,并调用结果函数 g。即g() = T(f)(1,2) = f(1,2) = f(1,2,5,0)

    • f: (a, b, c = 5, d = 0) -> {....} 为例,它需要 2 到 4 个参数。
    • f 进行部分应用,将其前两个参数固定为1 和2,并调用结果函数g'。即g' : (c=5, d=0) -> f(1, 2, c, d)。它需要 0 到 2 个参数。
    • 生成新函数T(g) : () -> {....},它正好接受0 个参数。即T(g)() = g'() = g'(5, 0) = f(1, 2, 5, 0)

无论如何,问题中的困境似乎取决于T,而不是函数式编程或柯里化或部分应用程序的任何方面。我不知道T 是否有足够的意义来拥有一个标准名称,但是像“修复/绑定默认参数”之类的应该没问题。

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2020-06-28
    • 2011-10-31
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多