2014-10-16 65 views
0

下面的Scala代码为我工作:Function.curried没有定义

def curry(s1: String)(s2: String): String = (s1 + " " + s2).toUpperCase 
val uncurry = Function.uncurried(curry _) 
println(uncurry("short", "pants")) 

但是下面的代码不会:

def cat(s1: String, s2: String): String = (s1 + " " + s2).toUpperCase  
def curry = Function.curried (cat _) 
println(curry("short")("pants")) 

上面给了我一个编译器错误(在Eclipse)

值咖喱是不是对象的成员函数

事实上,Eclipse中的intellisense也缺少函数对象上的curried函数......任何想法?

回答

5

A curried将采取例如功能(A, B) => C并将其变为A => B => C。 实际的咖喱和由此产生的功能取决于参数的数量。并没有定义只对一个参数进行曲调,因为只会导致相同的功能。 因此,curried未定义在Function对象上,而是在Function2,Function3等上定义。这意味着,你想写:

def cat(s1: String, s2: String): String = (s1 + " " + s2).toUpperCase 
val curry = (cat _).curried 
println(curry("short")("pants")) 
+0

酷,谢谢。我猜这一定是Scala 2.7和2.11之间的变化(在我正在阅读的教科书中,他们使用'Function.curried(cat _)'。无论如何,我更喜欢新的语法:-) – 2014-10-16 21:11:20

0

这不是Function对象,但在Function2 - Function22类型。

def curry = (cat _).curried 
0

这是对函数自身的方法

def cat(s1: String, s2: String): String = (s1 + " " + s2).toUpperCase 
     //> cat: (s1: String, s2: String)String 
def curry = (cat _).curried 
     //> curry: => String => (String => String) 
println(curry("short")("pants")) 
     //> SHORT PANTS