2016-10-04 6 views
-1

ここに私のコードです。エラーがあります理由ですなぜスカラーではアンダースコアが拡大しないのですか?

val b = a map { f(x => x.length) } // absolutely wrong 

:コンパイラは、次のようにコードを展開するように計算bが、それはそうするとき

def f(x: Int) = x 
val a = List(List(1), List(2, 2)) 

val b = a map { f(_.length) } // error 
val c = a map { item => f(item.length) } // no error 

エラーが発生します。正しい展開は、cを計算するときと同じようなものです。しかし、どのように機能F機能を期待していないとき?Fのための機能を拡張することができますコンパイラ

は私にとって、このexpandationはどんな意味がありません。誰もこの行動を説明できますか?ありがとう!

+1

期待どおりに展開されます。あなたの期待は正しいとは言えません。あなたがパターンマッチングに全部を比較すると考えるなら、あなたは何がうまくいかなかったかを知ることができます。これは正確ではありません...理解のために、これと似た '.map(_。length)'と考えると、この 'map(x => x match {case _ => x .length}) '。今あなたが書いたのは 'a.map(f(x => x x match {case _ => x.length}))' –

+0

です@Micho私はそれがその質問と重複しているとは認めません。その答えはプレースホルダーの構文が拡張されているとしか言いませんが、質問の著者は既にそれを知っています。 –

+0

@SarveshKumarSingh Thx!あなたの例は本当に私を助けます:) –

答えて

0

しかし、関数fが関数を期待していない場合、コンパイラはfの関数をどのように展開できますか?

この拡張は入力する前に行われるため、コンパイラは何かがまだ予期していないことを知りません。これは良いことです。1)コードを読むときfは、どのように機能が拡張するかを理解する必要があるかどうかを知る必要はありません。 2)fのタイプを変更しても、コードの意味は根本的に変更されません。

関連する問題