用于理解的Scala返回类型不匹配;找到:单位

时间:2018-11-23 06:34:38

标签: scala

我想了解为什么此代码无法编译:

  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语句,但我仍然不明白。

2 个答案:

答案 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()