问题上咖喱功能
问题描述:
只是想知道问题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)不?
答
我不是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)
一些有关的功能是如何膨胀是搞砸了与类型推断。
答
我不完全确定它为什么不起作用。但是,这似乎工作:
curriedNewSum(_:智力)(20)
后,我想过这个更多,它可能是可能有一个重载curriedNewSum方法
curriedNewSum(x:Double)(y:Int)
curriedNewSum(x:Float)(y:Int)
的存在哪一个会被选中?明确定义类型说明你想要的方法。
答
我怀疑这个类型应该被推断出来,如果没有歧义,并且这是一个错误或故意省略。
好问题(虽然你应该在最后完成你的想法)......这看起来像是斯卡拉本地类型推断的一个例子,它不足以推断出似乎很明显的东西。 – 2011-01-30 23:46:20
使用`_`常常会为我引发这个错误。我还没有发现一种模式。 – Raphael 2011-02-01 09:35:35