在Scala(v2.8.0,在SimplyScala.com上),如果我使用默认参数定义2-ary函数,为什么我不能将它作为1-ary函数传递?
此
def bah(c:Char, i:Int = 0) = i
List('a','b','c').map(bah)
给出了这个
error: type mismatch;
found : (Char, Int) => Int
required: (Char) => ?
List('a','b','c').map(bah)
答案 0 :(得分:2)
您定义的是方法,而非功能。
scala做的是将List('a','b','c').map(bah)
翻译为List('a','b','c').map((c: Char, i: Int) => bah(c, i))
,因为map
需要一个功能,您无法将方法传递给它。
最后,scala发现类型不匹配并警告你。
解决方法:
List('a','b','c').map(c => bah(c))
修改强>
进一步说明,我们只能将函数作为参数传递而不是方法(因为函数是对象),并且没有办法将方法强制转换为函数,只能构建一个调用该方法的函数。但有时scala可以通过一种方法为你构建该函数,这种方法会让你错误地认为方法可以作为参数传递。
无论如何,scala中的构建功能很容易。使用类型推断,您可以在将参数传递给List('a','b','c').map(c => bah(c))
之类的方法时省略输入参数的类型,构建函数c => bah(c)
并且不需要指出{{1} }是c
。