使用默认参数传递函数

时间:2014-07-02 07:41:00

标签: scala functional-programming default-parameters

在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)

1 个答案:

答案 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