我想了解为什么此代码无法编译:
def comb(list: List[(Char, Int)]): List[(Char, Int)] = {
for (tuple <- list) {
tuple match {
case p if (p._2 > 1) => List(p) :: List((p._1, p._2 - 1))
case _ => List(tuple)
}
}
}
如果我在函数外部执行此代码并将其直接应用于List
,它将起作用。我认为我的问题是,我不了解如何返回值。
我从Eclipse中收到此错误:
类型不匹配;找到:所需单位:列表[(Char,Int)]
我查看了其他答案,主要是使用if
语句,但我仍然不明白。
答案 0 :(得分:1)
那边你需要一个产量
def comb(list: List[(Char, Int)]): List[(Char, Int)] = {
for (tuple <- list) yield {
tuple match {
case p if (p._2 > 1) => p :: List((p._1, p._2 - 1))
case _ => List(tuple)
}
}
}
但是,这可能不是在Scala中执行此操作的最佳方法。您可以尝试使用类似的方法
def comb(list: List[(Char, Int)]): List[(Char, Int)] = {
list.map{
case(char:Char,int:Int) if(int >1)=> (char,int-1)
case(char:Char,int:Int) => (char,int)
}
}
答案 1 :(得分:1)
没有for()
的{{1}}等效于yield
,它不返回任何感兴趣的内容(foreach()
),但是Unit
的定义是:它应该返回comb()
,所以编译器会抱怨。
我们可以在List[(Char, Int)]
之后添加yield
,但是还有另一个问题:代码正在for()
内创建List
值,这意味着结果将是许多较小的for()
中的List
。仍然与方法的返回类型不匹配。
因此我们可以List
内部.flatten
来获得一个List
个元组,这将最终与返回类型匹配。
List
值得注意的是,只有一个生成器(def comb(list: List[(Char, Int)]): List[(Char, Int)] = {
for (tuple <- list) yield {
tuple match {
case p if p._2 > 1 => p :: List((p._1, p._2 - 1))
case _ => List(tuple)
}
}
}.flatten
comb(List(('a',9),('b',5),('c',1)))
//res0: List[(Char, Int)] = List((a,9), (a,8), (b,5), (b,4), (c,1))
部分)的for()
理解等效于<-
调用。 map()
调用后跟map()
等效于.flatten
调用。因此,以上等效于:
flatMap()