我正在Scala REPL中尝试以下代码,
val a = List(('a',4),('b',8))
val z = ('a',1)
a map (x => if (x._1 == z._1) (x._1, x._2 - z._2) else (z :: a))
我收到以下输出:List[Product] = List((a,3), List((a,1), (a,4), (b,8)))
为什么我会在List[Product]
中获得输出?
我应该怎么做才能得到输出的结果类型List[(Char, Int)]
而不是List[Product]
答案 0 :(得分:3)
您正在将函数应用于列表"a"
在第一次迭代中,你取(a,4)
,在这种情况下,你应用一个函数,将1减去元组的第二个元素。
结果为(a,3)
但是在第二个元素中,你使用cons运算符为“a”,因此该运算的结果是一个新的不可变列表。
('a',1) :: List(('a',4),('b',8)) === List((a,1), (a,4), (b,8))
IMO你想要的结果是:
List(('a',3),('b',8))
这可以这样实现:
a.map {
case (z._1, x) => (z._1, x - z._2)
case x => x
}