2

我有一个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 个参数。

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

4

1 回答 1

2

发表我的评论作为答案:似乎这个问题与函数式编程或currying或部分应用程序几乎没有关系,而恰恰是关于采用一个采用具有默认值的可选参数的函数,并制作一个没有可选参数的新函数其中默认参数已被修复。

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

    • Takef: (a, b, c = 5, d = 0) -> {....}需要 2 到 4 个参数。
    • 生成T(f) : (a,b) -> {...}恰好采用 2 个参数的新函数。即,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)

    • Takef: (a, b, c = 5, d = 0) -> {....}需要 2 到 4 个参数。
    • 将其前两个参数固定为 1 和 2进行部分应用f,并调用结果函数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有足够的意义来拥有一个标准名称,但是像“修复/绑定默认参数”这样的东西应该没问题。

于 2011-06-03T10:22:24.063 回答