我有下面的帮助函数。我正在尝试创建一个词频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).
,你能帮我找出我的错误吗?
2条答案
按热度按时间tquggr8v1#
写入
用反勾号代替
在该模式中,不带回溯的
c
是一个新变量,因此匹配所有内容,而不仅仅是以前的c
。scala Does match end in Nil?
5t7ly7z52#
add_to_lop函数的问题在于,第二个case模式(c,_)::xs将lop的第一个元素作为一个包含两个元素的元组进行匹配,其中第一个元素是c。然而,其目的是将第一个元素的第一个组成部分与给定字符c进行匹配。但是,由于您在模式中使用了相同的变量c,因此它隐藏了函数参数并匹配整个元组,而不仅仅是第一个元素。
要解决这个问题,您可以在模式中使用不同的变量名,如下所示:
在第二种情况下,我们对(x,n)进行模式匹配,并检查x是否== c,如果为真,则将计数n加1,并返回更新后的元组(x,n),否则,保留当前元组x,并对剩余的列表xs递归调用add_to_lop。
注意,我们可以使用x代替(x,n),因为x将匹配整个元组(x,n),并且在这种情况下我们只需要第一个元素x。