【发布时间】:2016-01-29 10:50:18
【问题描述】:
我正在学习 Scala,但在编写简单的 reducer 函数时遇到了一些麻烦。我想计算一个值在列表中出现的次数。因此,我编写了一个reducer/folding 函数,它将一个不可变的映射作为初始值,然后使用一个值在列表中出现的次数来迭代列表“更新”映射。很简单的东西,但是我遇到了类型系统的问题(啊……在 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: 为什么??
任何帮助将不胜感激。谢谢
【问题讨论】:
标签: scala generics types scala-collections