获取错误“构造函数无法实例化为预期类型;找到:(T1,T2)required:List [(Char,Int)]”

时间:2014-10-22 10:07:49

标签: scala

我是Scala的新手,正在进行关于列表和模式匹配的小任务。赋值是直接计算列表中每个唯一字符的频率,并发出(Char,Int)元组列表。我在尝试模式匹配(...case(cs.head, _)...)的行上收到错误,以查看当前字符是否已被计算。

def times(chars: List[Char]): List[(Char, Int)] = {
    def calcCharFreq(c: Char, cs: List[Char], count: Int): (Char, Int) = {
        if(cs.isEmpty) (c, count)
        else
            if(c == cs.head) calcCharFreq(c, cs.tail, count+1)
            else calcCharFreq(c, cs.tail, count)
    }

    def calcFreq(cs: List[Char], pairs: List[(Char, Int)]): List[(Char, Int)] = {
        if(cs.isEmpty) pairs
        else{
            pairs match {
                case (cs.head, _) => calcFreq(cs.tail, pairs)
            }
            calcFreq(cs.tail, calcCharFreq(cs.head, cs.tail, 0) :: pairs)
        }
    }
    calcFreq(chars, Nil)
}

提前致谢 SK

2 个答案:

答案 0 :(得分:1)

要实际检查pairs中是否已有与当前字符(cs.head)匹配的元组,您希望将包含相关匹配项的else子句替换为:< / p>

  if (pairs.exists(_._1 == cs.head)) {
    calcFreq(cs.tail, pairs)
  } else {
    calcFreq(cs.tail, calcCharFreq(cs.head, cs.tail, 1) :: pairs) // I noticed this needed to pass a 1, not a 0, for the initial count, or you would fail to count the first instance of the character...
  }

由于@tuxdna和@AlexeyRomanov已经给出的理由,比赛本身无论如何都不会编译。

答案 1 :(得分:0)

  1. 您不能像这样在模式匹配中使用cs.head。您需要将它分配给以大写字母开头的变量(case中的小写变量创建 new 变量,即使外部范围中有这样的标识符)。

  2. (_, _)是(2元素)元组的模式,pairs不是元组。要匹配列表的头部和尾部,请编写case head :: tail

  3. 结合,在这种情况下你需要

    else {
      val C = cs.head
      pairs match { case C :: _ => ... }
    }
    

    请注意,您还需要处理其他情况。