使用flatMap时导致此错误的原因是什么?

时间:2013-11-09 15:40:58

标签: scala

此代码:

1 until 3 flatMap (x => x + 1)

在工作表中导致此错误:

Multiple markers at this line
- type mismatch;  found   : Int(1)  required: String
- type mismatch;  found   : Int(1)  required: String
- type mismatch;  found   : x.type (with underlying type Int)  required: ?{def +(x$1: ? >: Int(1)): ?} Note that implicit conversions are not applicable because they are ambiguous:  both method int2long in object Int of type (x: Int)Long  and method int2float in object Int of type (x: Int)Float  are possible conversion functions from x.type to ?{def +(x$1: ? >: Int(1)): ?}
- type mismatch;  found   : x.type (with underlying type Int)  required: ?{def +(x$1: ? >: Int(1)): ?} Note that implicit conversions are not applicable because they are ambiguous:  both method int2long in object Int of type (x: Int)Long  and method int2float in object Int of type (x: Int)Float  are possible conversion functions from x.type to ?{def +(x$1: ? >: Int(1)): ?}

此代码的行为符合预期:1 until 3 flatMap (x => x + 1)

适用于map的所有馆藏是否也适用于flatMap

3 个答案:

答案 0 :(得分:1)

我假设你说:

此代码的行为符合预期:1 until 3 flatMap (x => x + 1)

你打算写1 until 3 map (x => x + 1)

map版本有效,因为mapA => B获取了一个函数,并返回B列表(即List[B])。

flatMap版本不起作用,因为flatMap需要A => List[B]中的函数,然后返回List[B]。 (更确切地说,它是一个GenTraversableOnce[B]但你可以在这种情况下将它当作一个List来对待它。你试图应用于flatMap的函数不会返回一个List,所以它不适用于你想要的东西做。

从该错误消息中,很难看到这一点。一般来说,如果您不疯狂尝试从语句中删除所有括号,我认为您将在此类语句上获得更清晰的错误消息。

答案 1 :(得分:1)

flatMap期望函数的结果可以遍历

def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): IndexedSeq[B]

不是简单的类型(x + 1) 稍后将所有结果连接成单个序列。

工作示例:

scala> def f: (Int => List[Int]) = { x => List(x + 1) }
f: Int => List[Int]

scala> 1 until 3 flatMap ( f )
res6: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 3)

答案 2 :(得分:0)

我认为flatMap的想法是你传递的函数有一个列表(或者#34; GenTraversableOnce"我只是非正式地调用它列表),因此映射会产生在列表列表中。 flatMap将其展平为一个列表。

或者换句话说,我认为相当于你的地图示例 1到3 flatMap(x => List(x + 1))