2011-01-30 105 views
4

只是想知道问题WRT钻营问题上咖喱功能

如果我们定义了咖喱功能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)不?

+0

好问题(虽然你应该在最后完成你的想法)......这看起来像是斯卡拉本地类型推断的一个例子,它不足以推断出似乎很明显的东西。 – 2011-01-30 23:46:20

+0

使用`_`常常会为我引发这个错误。我还没有发现一种模式。 – Raphael 2011-02-01 09:35:35

回答

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) 

一些有关的功能是如何膨胀是搞砸了与类型推断。

0

我不完全确定它为什么不起作用。但是,这似乎工作:

curriedNewSum(_:智力)(20)

后,我想过这个更多,它可能是可能有一个重载curriedNewSum方法

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

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

0

我怀疑这个类型应该被推断出来,如果没有歧义,并且这是一个错误或故意省略。