在scala中除了null之外无法达到的情况

b5lpy0ml  于 2023-03-12  发布在  Scala
关注(0)|答案(2)|浏览(147)

我有下面的帮助函数。我正在尝试创建一个词频List(a,b,a) => [(a,2),(b,1)]

def add_to_lop(c:Char, lop: List[(Char, Int)]):List[(Char, Int)] = {
      lop match {
        case List() => List((c,1))
        case (c, _)::xs => add_to_pair(c,lop.head)::lop.tail
        case _ => lop.head::add_to_lop(c, lop.tail)
      }

我认为只要lop的头不满足lop.head._1==c,case就应该到达第三个case(除非lop为空,它是第一个case),但是编译警告说第三个case几乎不可达-case _ => lop.head::add_to_lop(c, lop.tail); Unreachable case except for null (if this is intentional, consider writing case null => instead).,你能帮我找出我的错误吗?

tquggr8v

tquggr8v1#

写入

case (`c`, _)::xs =>

用反勾号代替

case (c, _)::xs =>

在该模式中,不带回溯的c是一个新变量,因此匹配所有内容,而不仅仅是以前的c
scala Does match end in Nil?

5t7ly7z5

5t7ly7z52#

add_to_lop函数的问题在于,第二个case模式(c,_)::xs将lop的第一个元素作为一个包含两个元素的元组进行匹配,其中第一个元素是c。然而,其目的是将第一个元素的第一个组成部分与给定字符c进行匹配。但是,由于您在模式中使用了相同的变量c,因此它隐藏了函数参数并匹配整个元组,而不仅仅是第一个元素。
要解决这个问题,您可以在模式中使用不同的变量名,如下所示:

def add_to_lop(c: Char, lop: List[(Char, Int)]): List[(Char, Int)] = {
  lop match {
    case List() => List((c, 1))
    case (x, n) :: xs if x == c => (x, n + 1) :: xs
    case x :: xs => x :: add_to_lop(c, xs)
  }
}

在第二种情况下,我们对(x,n)进行模式匹配,并检查x是否== c,如果为真,则将计数n加1,并返回更新后的元组(x,n),否则,保留当前元组x,并对剩余的列表xs递归调用add_to_lop。
注意,我们可以使用x代替(x,n),因为x将匹配整个元组(x,n),并且在这种情况下我们只需要第一个元素x。

相关问题