2013-05-05 60 views
1

我想了下面这段代码在斯卡拉REPL,获取结果列表[(字符,诠释)而不是List [产品]

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

不是双重嵌套表和'列表[(字符,诠释)]'在同一时间oxymorons? – 2013-05-05 20:20:06

+1

根据你的价值观,你想要具体的结果是什么?请注意,if-part和else部分在返回的类型中不匹配。您要么返回一个新的对,要么返回一个对的列表。 – 2013-05-05 20:27:52

回答

3

您在应用列表中的一个功能,每一个元素"a"

在你把(a,4),并在第一次迭代在这种情况下,您正在应用一个将元素的第二个元素减1的函数。

结果是(a,3)

但在第二个元素使用的是利弊经营者为“A”,所以此操作的结果是一个新inmmutable列表。

('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 
} 
相关问题