2016-08-25 8 views
0

Doublesのストリームを、2つのパラメータを取るメソッドにマップする場合、そのうちの1つにデフォルト値があります。私の方法は、私が合格する必要がある唯一の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

どのスカラー版を使用していますか(私は2.11.8 REPLです)?動作を再現できません。 'val pow2 = pow(_) 'はコンパイルエラー' missing parameter type'を取得します。私が '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(_)は2つのx => pow(x)の2つに展開され、この時点でコンパイラはタイプ注釈なしでxのものを推論することはできません。

+0

'pow'は2つの引数を取るので、' pow(_) 'が何をするのか分かりません。あなたはそれをコメントできますか? –

+0

型を明示的に書くと 'val pow2 = pow(_)'は 'val pow2:Double => Double = x => pow(x)'の省略形です。 – dveim

+0

@dveimは何を言った。型アノテーション 'pow(_)'がなければ、コンパイラに "後で' pow'関数があることを伝えます。後で '_'パラメータを与えますが、どの型にするのかは教えていません。あなたはそれに矛盾するもの、例えば 'String'や正しいもの' Double'を与えるかもしれません。このエラーは、前者の場合に対する保護手段です。 – sebszyller

関連する問題