2016-07-28 47 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;它不会错误地推断出类型。你不会告诉编译器你想要什么。

相关问题