2016-07-28 78 views
0

我試圖拉IDS出一套XML元素的屬性id的,但它失敗,出現錯誤類型:爲什麼scala無法推斷映射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_有什麼不同?

+0

在第一種情況下,它是'map((x => x \「@id」).text)',而不是你期望的 –

回答

1

Scala正在尋找在將佔位符語法轉換爲匿名函數時形成「完整」表達式的最內層部分。不要讓我們看看你的例子:

(_ \ "@id").text 

其實裏面包含它的另一個完整的體現:

_ \ "@id" 

所以這個表達式,而不是轉化爲一個匿名函數:

x => x \ "@id" 

這是然後在外表中使用如下:

(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

當你寫這樣的事:

list map(_.toInt)

你直接告訴別人你想映射的list元素編譯器。當你寫:

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

你告訴您要採取elem並將其映射編譯器,這是同我以前的例子,但更加明確。但是,當你寫:

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

你不告訴它你想使用隱式(我的第一個例子)(你的第二個例子)集合的元素或明確。相反,你告訴它採取任何東西_並提取id。

TLDR;它不會錯誤地推斷出類型。你不會告訴編譯器你想要什麼。

相關問題