2016-08-25 43 views
0

我想将Doubles的流映射到一个方法,该方法需要两个参数,其中一个参数具有默认值。我想使用默认参数,所以我的方法只有1个参数,我需要通过:在地图中使用默认参数的方法

def pow(x:Double, exponent:Double=2.0) = { 
    math.pow(x,exponent) 
    } 

我发现了以下工作,但我不明白为什么:

val res = (1 to 100).map(_.toDouble).map(pow(_)) 

我特别困惑,因为以下不工作(编译错误,因为有缺少类型的信息):

val pow2 = pow(_) 
    val res = pow2(2.0) 
    println(res) // expect 4.0 
+0

编译器无法清楚地干扰为pow2提供的类型。如果你说val pow2 = pow(_:Double),那么这个例子就行得通。 – sascha10000

+0

你用什么scala版本(我的版本是2.11.8 REPL)?无法重现行为,'val pow2 = pow(_)'得到编译错误'缺少参数类型'。如果我写'val pow2:Double => Double = x => pow(x)',那么一切正常。 – dveim

+0

抱歉,你是对的,它不是运行时错误 –

回答

3

的编译器不能推断,您将提供给类型。在res映射中,您明确给它一个Doubles的集合,因此pow(_)不会抱怨。但是,在val pow2 = pow(_)的情况下,它抱怨缺少类型参数。更改为

val pow2 = pow(_: Double) 
val res = pow2(2.0) 
println(res) 

它会工作得很好。 pow(_)将被扩展为两个x => pow(x),此时编译器无法在没有类型注释的情况下输入x

+0

我真的不明白'pow(_)'做了什么,因为'pow'有两个参数。你能评论一下吗? –

+0

如果明确写入类型,则'val pow2 = pow(_)'是'val pow2:Double => Double = x => pow(x)'的简写。 – dveim

+0

@dveim说什么。如果没有类型注释'pow(_)'你告诉编译器“这里是'pow'函数,稍后我会给你一些'_'参数”,但是你不会告诉它它是什么类型。你可能会给它一个冲突的,比如'String'或者一个正确的'Double'。错误是对前一种情况的保护。 – sebszyller