2

What am I doing wrong? Where does String come from?

Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL

scala> List(1).fold(Map()) { (m, x) => m + (x -> 1) }
<console>:9: error: type mismatch;
 found   : (Any, Int)
 required: String
              List(1).fold(Map()) { (m, x) => m + (x -> 1) }
                                                     ^

scala> List(1).foldLeft(Map()) { (m, x) => m + (x -> 1) }
<console>:9: error: type mismatch;
 found   : (Int, Int)
 required: (Nothing, Nothing)
              List(1).foldLeft(Map()) { (m, x) => m + (x -> 1) }
                                                         ^
4

1 回答 1

4

我将按相反的顺序回答:

  • 对于第二个错误,您需要帮助类型推断:Scala 编译器无法知道的类型Map()(它需要期待第二个参数组,运算符,它无法做到),因此将其推断为Map[Nothing, Nothing](). 然后尝试将 a 添加(Int, Int)到 aMap[Nothing, Nothing]显然是行不通的。

  • 对于第一个错误,您使用fold,这需要一个二元运算符,带有 type (A,A) => A,所以在您的情况下(Int, Int) => Int,这可能不是您想要的,因为您尝试折叠成完全不同的类型:foldLeft并且foldRight可以做到这一点。

    编辑:它正在寻找一个String,因为它相信m并且x必须共享相同的类型,所以它们有类型Any(它们唯一的共同超类型),它没有+方法,但它有一个隐式转换,为.. .String连接;所以它转换m为 a然后在 . 的另一边String寻找另一个。我知道,这很可悲。String+

您只需要注释上的类型Map

scala> List(1).foldLeft(Map[Int, Int]()) { (m, x) => m + (x -> 1) }
res8: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1)

或者,以更清晰的方式显示意图:

scala> List(1).foldLeft(Map.empty[Int, Int]) { (m, x) => m + (x -> 1) }
于 2013-05-20T21:41:26.283 回答