只是想知道问题 w.r.t Currying

如果我们已经定义了柯里化函数 curriedNewSum

scala> def curriedNewSum(x : Int)(y : Int) = x + y
curriedNewSum: (x: Int)(y: Int)Int

scala> curriedNewSum(10)(20)
res5: Int = 30

scala> var tenPlus = curriedNewSum(10)_
tenPlus: (Int) => Int = <function1>

scala> tenPlus(20)
res6: Int = 30

scala> var plusTen = curriedNewSum(_)(20)
<console>:6: error: missing parameter type for expanded function ((x$1) => curri
edNewSum(x$1)(20))
       var plusTen = curriedNewSum(_)(20)
                                   ^

那么为什么 curriedNewSum(10)_ 有效而 curriedNewSum(_)(10) 无效呢?

最佳答案

我不是 100% 确定到底是什么问题,但我强烈怀疑这不是你认为的那样。

尝试,例如,

var plusTen = curriedNewSum(_)

你会看到它会返回一个 Function1[Int, Function1[Int, Int]] 。现在试试这个:
var plusTen = (curriedNewSum(_))(10)

并看到它的工作!嗯,这转化为:
var plusTen = ((x: Int) => curriedNewSum(x))(10)

而另一种方式转化为:
var plusTen = (x) => curriedNewSum(x)(10)

关于函数如何扩展的一些事情正在搞砸类型推断。

关于scala - 关于柯里化函数的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4845998/

10-16 03:06