2016-07-28 6 views
0

私はXML要素のセットのid属性のうち、idを引くしようとしているが、それは型エラーで失敗します。マッピングされたNodeSeqの型をスカラーが推論できないのはなぜですか?

scala> (xml \\ "contentitem").map((_ \ "@id").text) 
<console>:14: error: missing parameter type for expanded function ((x$1) => x$1.$bslash("@id")) 
     (xml \\ "contentitem").map((_ \ "@id").text) 
            ^

私は明示的に私のマップで指定されたのval(elem)を提供する場合、それは動作します:

scala> (xml \\ "contentitem").map(elem => (elem \ "@id").text) 
res8: scala.collection.immutable.Seq[String] = List(20761, 22798, 22799, 21167, 21438, 20770, 21480, 21906, 21907, 21923, 22766, 22771, 22794, 22800, 22803, 22804, 22818, 22819, 22820, 22821) 

ここでの違いはわかりません。 elem_とどのように異なっていますか?

list map(_.toInt)

あなたが直接あなたがlistの要素をマッピングするコンパイラに指示:

+0

最初のケースでは 'map((x => x \" @id ")。text)'です。 –

答えて

1

Scalaは、プレースホルダ構文を無名関数に変換するときに「完全」な表現を形成する最も内側の部分を探しています。ないのは、あなたの例を見てみましょう:

_ \ "@id" 

だからではなく、匿名関数に変換され、この式:

x => x \ "@id" 

ある

実際に
(_ \ "@id").text 

は、その内部に別の完全な表現が含まれています次のように外側の式で使用されます。

(x => x \ "@id").text 

は今、この表現であり、したがって、あなたのエラーメッセージxの種類を推測する方法はありません:

missing parameter type for expanded function ((x$1) => x$1.$bslash("@id")) 

UPDATEのみ

_は完全な式とはみなされませんので、コード.map(List(_))最も完全な式はList(_)であり、x => List(x)

http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#placeholder-syntax-for-anonymous-functions

1

あなたはこのような何かを書くとき。あなたが書くとき:

(xml \\ "contentitem").map(elem => (elem \ "@id").text) 

をあなたは私の前の例と同じですが、より明示的である、あなたはelemを取り、それをマッピングするコンパイラに伝えます。しかし、あなたが書くとき:

(xml \\ "contentitem").map((_ \ "@id").text)

をあなたは暗黙的にコレクションの要素を使用したいということを教えていない(私の最初の例)または明示的(あなたの第二の例)。代わりに、_というものを取ってIDを抽出するように指示します。

TLDR;型を推定するのに失敗しません。あなたはあなたが望むものをコンパイラに伝えません。

関連する問題