2009-09-23 83 views
2

这里是POC代码:不能Scala的理解错误类型

object TypeTest extends Application { 
    val stuff = List(1,2,3,4,5) 
    def joined:String = stuff.reduceLeft(_ + ", " + _) 

    println(joined) 
}                        

在编译时,它提供了以下错误:

tt.scala:4: error: type mismatch; 
found : java.lang.String 
required: Int 
    def joined:String = stuff.reduceLeft(_ + ", " + _) 
                ^
tt.scala:4: error: type mismatch; 
found : Int 
required: String 
    def joined:String = stuff.reduceLeft(_ + ", " + _) 
           ^

写像

reduceLeft(_.toString + ", " + _.toString) 
的加入功能

没有帮助,还给出了同样的错误。但是,如果我把它写像

def joined:String = stuff.map(_.toString).reduceLeft(_ + ", " + _) 

一切都很好。

能有人请解释类型的错误,这种怪异的组合?这里究竟发生了什么?第二个特别奇怪,因为Int到String有一个隐式转换。

回答

9

reduceLeft要求功能块(括号内)返回相同类型的集合。这是因为块被递归调用,直到集合的所有值被消耗。

东西是一个列表[INT],但(_ + “” + _)是一个字符串,因此类型错误。

的类似方法reduceLeft是foldLeft。区别在于集合类型和结果类型可能不同。例如:

stuff.foldLeft("") { _ + ", " + _ } // => java.lang.String = , 1, 2, 3, 4 

我猜你的例子表示,但如果你真的想逗号分隔值的字符串,那么下面会更好:

stuff.mkString(", ") // => String = 1, 2, 3, 4 
+0

啊,是的,你说得对。我以某种方式将它与折叠混淆* – 2009-09-23 10:36:00

1

我刚刚开始使用Scala的了。这是我的理解。

'stuff'是一个Int列表,因此'reduceLeft'需要一个Int参数并返回一个Int(基于this)。但是,您将字符串作为参数(错误1)并尝试将结果分配给字符串(错误2)。这就是为什么你有这样的错误。

+0

谢谢。我现在明白了。这对我来说真是愚蠢:) – 2009-09-23 10:38:38