为什么curried函数需要外部参数名称?

jem*_*ons 18 currying swift

鉴于这种简单的currying功能:

func foo(x:Int)(y:Int)->String{
  return "\(x) with \(y)"
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

let bar = foo(1)
bar(2) //<- error: Missing argument label 'y:' in call
Run Code Online (Sandbox Code Playgroud)

如果我将调用标记为bar(如在bar(y:2)),一切正常.但我不明白为什么参数名称是必要的.有什么办法可以避免吗?

显而易见的事:

func foo(x:Int)(_ y:Int)->String ...

似乎不起作用.

Gab*_*lla 8

这是一个错误,你应该在bugreport.apple.com上提交雷达

作为确认,如果您放置下划线,就像这样

func foo(x: Int)(_ y: Int) -> String
Run Code Online (Sandbox Code Playgroud)

你收到警告

参数中的多余'_':'y'没有关键字参数名称

所以它明确地说y没有外部名称,但在调用时仍然需要一个,这显然违背了语言规范.


Col*_*inE 0

我不确定我是否完全理解你的柯里化。这是我的看法。我有一个函数 foo 如下:

func foo(x:Int, y:Int) -> String{
  return "\(x) with \(y)"
}

let bar = foo(1, 2) // gives "1 with 2"
Run Code Online (Sandbox Code Playgroud)

我希望柯里化此函数来“修复” 的值x,因此请按如下方式操作:

func fooCurry(x:Int) -> (Int -> String) {
  func curry(y:Int) -> String {
    return foo(x, y)
  }
  return curry
}
Run Code Online (Sandbox Code Playgroud)

上面返回一个新函数,可以按如下方式使用:

let curriedFoo = fooCurry(1)
let barWithCurry = curriedFoo(2) // gives "1 with 2"
Run Code Online (Sandbox Code Playgroud)

返回的函数fooCurry具有签名(Int -> String),这意味着该参数没有外部名称。

  • 你在这里所做的基本上是“手工”咖喱。`func foo(x: Int)(y: Int) -&gt; String` 应该作为一种语言功能开箱即用,但事实并非如此。 (3认同)