使用元组进行Scala折叠操作

时间:2015-11-28 15:08:20

标签: scala

var tt = ['ID', 'Name', 'Price', 'Quantity', 'Item Total'];
            for(i; i < tt.length; i++){
                var x = document.createElement('th');
                x.appendChild(document.createTextNode(tt[i]))
                header.appendChild(x);
            }

但我得到以下错误=

val g = List(1,2,3)

val k = g.fold((0,0))((a:Tuple2[Int,Int],b:Int)=>(a._1+b,a._2+1))

有人可以解释,为什么它期待“任何”类型。

但下面有效:

found   : ((Int, Int), Int) => (Int, Int)
 required: (Any, Any) => Any
              g.fold((0,0))((a:Tuple2[Int,Int],b:Int)=>(a._1+b,a._2+1))

2 个答案:

答案 0 :(得分:7)

您的意思是使用foldLeft

val k = g.foldLeft((0,0))((a:Tuple2[Int,Int],b:Int)=>(a._1+b,a._2+1))

fold有签名

def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1 

因此它要求元素类型与累加器类型匹配,而您的示例对于两者都有不同的类型。

答案 1 :(得分:0)

具体回答这一部分:

  

有人可以解释,为什么它期待&#34;任何&#34;类型。

李的答案给出了签名:fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1。在您的情况下,编译器知道AInt,并且您将(0,0)的类型(Int, Int)传递为z。因此A1必须是Int(Int, Int)的超类型。 Any是他们最不重要的上限。