此代码:
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
?
答案 0 :(得分:1)
我假设你说:
此代码的行为符合预期:1 until 3 flatMap (x => x + 1)
你打算写1 until 3 map (x => x + 1)
map
版本有效,因为map
从A => 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))