在 Fold 方法中键入不匹配的 Scala

Type mismatch scala in Fold method

我正在学习 Scala,但在编写简单的 reducer 函数时遇到了一些麻烦。我想计算一个值在列表中出现的次数。因此,我写了一个 reducer/folding 函数,它以一个不可变的映射作为初始值,然后迭代列表 "updating" 映射与一个值在列表中出现的次数。很简单的东西,但我遇到了类型系统的问题(啊...在 JavaScript 和 Python 上花费了太多时间)

这是函数:

def times(chars: List[Char]): List[(Char, Int)] = {

  val acc:Map[Char, Int] = Map()

  def count(acc:Map[Char, Int], c:Char) = {
    if (acc contains c) acc + (c -> (acc(c) + 1))
    else acc + (c -> 1)
  }

  chars.fold(acc)(count).toList
}

我不明白为什么会出现以下类型错误:

[error] /Users/giuseppe/courses/scala_functional_programing/lessons/week_4/assignment/src/main/scala/patmat/Huffman.scala:85: type mismatch;
[error]  found   : (Map[Char,Int], Char) => scala.collection.immutable.Map[Char,Int]
[error]  required: (Any, Any) => Any
[error]       chars.fold(acc)(count)
[error]                       ^
[error] /Users/giuseppe/courses/scala_functional_programing/lessons/week_4/assignment/src/main/scala/patmat/Huffman.scala:85: type mismatch;
[error]  found   : Any
[error]  required: List[(Char, Int)]
[error]       chars.fold(acc)(count)
[error]                 ^
[error] two errors found

Map[Char, Int]Any 的子类型吗?

* 编辑 *

更有趣的是,我刚刚发现如果我使用 foldLeft,它会正常工作。 :confused: 为什么??

任何帮助将不胜感激。谢谢

您似乎需要 foldLeft 函数而不是 fold。 它有正确的签名。

def foldLeft[B](z: B)(f: (B, A) => B): B = { // in your case B is Map and A is Char
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op) // in your case arguments of count functions should be same