为什么我会得到“模式类型与预期类型不兼容”?
问题描述:
我遇到了我自己无法解决的Scala代码错误(我是Scala的新手)。 我有以下代码:为什么我会得到“模式类型与预期类型不兼容”?
def myFunction(list: List[Any]): String = {
var strItems : String = "";
list.foreach(item => {
strItems += item match {
case x:JsonSerializable => x.toJson()
case y:String => ("\"" + y + "\"")
case _ => item.toString
}
if(item != list.last)
strItems += ",";
})
strItems;
}
我得到的错误是:
错误:模式类型与预期的类型不兼容; 发现:字符串 需要:单位 情况下,y:字符串=>( “\” “+ Y + ”\“”)
知道为什么?
PS:有代码myFunction的
答
在原来的问题方面,该代码不ç由于它需要在比赛周围使用括号,所以称为ompile。 strItems += (item match { ... })
写这篇的更“实用”的方式可能是沿着线的东西:
def myFunction(list:List[Any]):String = {
val strings:List[String] = list.map{
case x:JsonSerializable => x.toJson()
case y:String => ("\"" + y + "\"")
case z => z.toString
}
strings.mkString(",")
}
你也许可以使用一个视图,使其懒惰,更多的“高性能”,虽然我不如果将两个底层循环(map
& mkString
)合并成一次遍历,就知道了我的头脑。
答
这里更高性能的方式是你的代码的形式,以更简洁形式一起编译(W/O为JsonSerializable
任何定义)(Scala中2.8)(也恰好是点 - *):
object Javier01 {
def
javFunc(list: List[Any]): String = {
val strItems = new StringBuilder()
list.foreach { item =>
strItems.append (item match {
// case x: JsonSerializable => x.toJson()
case y: String => "\"" + y + "\""
case _ => item.toString
})
if (item != list.last)
strItems.append(",")
}
strItems.toString
}
def
rrsFunc(anys: List[Any]): String =
anys map {
// case x: JsonSerializable => x.toJson()
case s: String => "\"" + s + "\""
case x => x.toString
} mkString ","
def
main(args: Array[String]): Unit = {
val stuff = List(true, 1, 123.456, "boo!")
printf(" stuff : %s%njavFunc(stuff): %s%nrrsFunc(stuff): %s%n%n",
stuff, javFunc(stuff), rrsFunc(stuff))
}
}
从运行此的输出是:
% scala Javier01
stuff : List(true, 1, 123.456, boo!)
javFunc(stuff): true,1,123.456,"boo!"
rrsFunc(stuff): true,1,123.456,"boo!"
使用'view'会将'map'&'mkString'变成一次遍历。 – 2010-06-16 01:16:17