0

我对 scala 中的这部分代码有疑问

object Test12 {
  def times(chars: List[Char]): List[(Char, Int)] = {
    val sortedChars = chars.sorted
    sortedChars.foldLeft (List[(Char, Int)]()) ((l, e) =>
        if(l.head._1 == e){
            (e, l.head._2 + 1) :: l.tail
        } else {
            (e, 1) :: l
        } )
  }

  val s = List('a', 'b')

  val c = times s
}

最后一行给出一个错误:

缺少方法时间的参数;如果您想将其视为部分应用的函数,请使用 `_' 遵循此方法

但我不明白为什么,因为我给最后一个函数 - foldLeft 提供了 2 个参数。

提前感谢您的帮助!

代码的想法是计算每个字符在给定列表中出现的时间

4

2 回答 2

3

时间的语法很好,但调用时需要使用括号,即:

val c = times(s)

但它不起作用,因为您使用 l.head 而不检查 l 是否为 Nil,并且空列表没有头。例如,您可以使用 match 检查:

def times(chars: List[Char]): List[(Char, Int)] = {
  val sortedChars = chars.sorted
  sortedChars.foldLeft (List[(Char, Int)]()) ((a,b) => (a,b) match {
    case (Nil, e) => (e, 1) :: Nil
    case ((e, count) :: l, f) => 
        if (e == f) (e, count + 1) :: l
        else (f, 1) :: (e, count) :: l
  })
}

虽然更简单的方法是使用更高级别的集合函数:

def times(chars: List[Char]) = chars.groupBy(c=>c).map(x=>(x._1,x._2.length)).toList
于 2013-06-03T13:51:00.933 回答
1
val c = times s

你不能像这样调用没有括号的方法。尝试times(s)this times s

于 2013-06-03T13:50:04.837 回答