为什么Scala 2.9.1没有意识到NodeSeq也是GenTraversableOnce

为什么Scala 2.9.1没有意识到NodeSeq也是GenTraversableOnce,scala,Scala,我不断地发现这个错误: [error] found : (scala.xml.NodeSeq, Int) => scala.xml.NodeSeq [error] required: (scala.xml.NodeSeq, Int) => scala.collection.GenTraversableOnce[?] [error] { answers.zipWithIndex.flatMap(answerElem) } [error]

我不断地发现这个错误:

[error]  found   : (scala.xml.NodeSeq, Int) => scala.xml.NodeSeq
[error]  required: (scala.xml.NodeSeq, Int) => scala.collection.GenTraversableOnce[?]
[error]       { answers.zipWithIndex.flatMap(answerElem) }
[error]                                      ^
[error] one error found
answers
只是一个
列表[NodeSeq]
answerElem
只是检查索引并在元素上设置属性。如您所见,它的参数是正确的类型,
NodeSeq
表示它扩展了
GenTraversableOnce

我是否需要给它一个提示来帮助它编译


Todd

我怀疑这是由于编译器试图解析两个隐式CanBuildFrom而找不到两个合适的对。但是,将zipWithIndex和flatMap分开似乎可以让编译器正确地解析每一个的CanBuildFrom

{ val zip = answers.zipWithIndex; zip.flatMap(answerElem) }

您能否确认您的函数类型是
Function2[NodeSeq,Int,gentraversableone[\u]]]
还是
Function1[(NodeSeq,Int),gentraversableone[\u]]
?如果是前者,那可能是您的问题,因为
zipWithIndex
生成元组。答案是:

answers.zipWithIndex.flatMap(answerElem.tupled)

我用一个非元组函数做了一个实验,重现了类似您的问题,并用上面的方法修复了它。虽然不是最有用的错误消息…

但没有帮助的错误消息是一个bug,是2.9.1中的回归。如果这就是问题所在,那么在主干中,消息的形式是“found:(A,B)=>C,required:((A,B))=>C”。我忘了那是一个元组。一旦我改变了我的函数,希望得到一个元组,一切都正常了。谢谢你,即席发言,告诉我错误信息是一个bug。我感觉好多了。