List 在列表[(Char,Int)]而不是列表[产品]中获取结果

List 在列表[(Char,Int)]而不是列表[产品]中获取结果,list,scala,types,tuples,List,Scala,Types,Tuples,我正在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[(Char,Int)]而不是List[Pr

我正在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[(Char,Int)]
而不是
List[Product]

您正在对列表中的每个元素应用一个函数
“a”

在第一次迭代中,您使用
(a,4)
,在本例中,您将应用一个函数,将1减去元组的第二个元素

结果是
(a,3)

但是在第二个元素中,您使用cons运算符来表示“a”,因此此操作的结果是一个新的inmmutable列表

('a',1) :: List(('a',4),('b',8)) === List((a,1), (a,4), (b,8))
在我看来,你想要的结果是:

List(('a',3),('b',8))
可以这样实现:

a.map {
    case (z._1, x) => (z._1, x - z._2)
    case x => x
}

双重嵌套列表和
List[(Char,Int)]
不是同时使用矛盾修饰法吗?考虑到你的价值观,你希望在具体中得到什么结果?请注意,if部分和else部分在返回的类型中不匹配。要么返回一个新的对,要么返回一个对列表。