关于咖喱功能的问题

时间:2011-01-30 22:29:33

标签: scala

想知道问题w.r.t Currying

如果我们已经定义了curried函数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)不是吗?

3 个答案:

答案 0 :(得分:7)

我不是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)

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

答案 1 :(得分:0)

我不确定为什么它不起作用。但这似乎有效:

curriedNewSum(_的:int)(20)

在我想到这个之后,可能存在重载curriedNewSum方法的可能性

curriedNewSum(x:Double)(y:Int)
curriedNewSum(x:Float)(y:Int)

哪一个会被选中?明确定义类型说明你想要哪种方法。

答案 2 :(得分:0)

我怀疑应该在没有歧义的情况下推断出类型,这是一个错误或故意遗漏。