Scala:Map.flatten的用例?

Bra*_*ins 6 dictionary scala flatten

Map.flatten上文档说明如下:

将此可遍历集合的映射转换为由这些可遍历集合的元素组成的映射.

我得到了"可遍历集合的地图".例如,这将是一个列表地图.仅凭这个定义,a就有Map[Int, List[Int]]资格了.

但是什么是"这些可穿越集合的元素形成的地图"?这听起来很简单,但我很难让它发挥作用.

文档中提供的示例代码是......嗯......我们应该说,不适用吗?

val xs = List(
           Set(1, 2, 3),
           Set(1, 2, 3)
         ).flatten
// xs == List(1, 2, 3, 1, 2, 3)

val ys = Set(
           List(1, 2, 3),
           List(3, 2, 1)
         ).flatten
// ys == Set(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

我尝试了一些不同的东西,但它们会产生同样的错误.以下是几个例子:

scala> val m = Map(List(1) -> List(1,2,3), List(2) -> List(4,5,6), List(3) -> List(7,8,9))
m: scala.collection.immutable.Map[List[Int],List[Int]] = Map(List(1) -> List(1, 2, 3), List(2) -> List(4, 5, 6), List(3) -> List(7, 8, 9))

scala> m.flatten
<console>:9: error: No implicit view available from (List[Int], List[Int]) => scala.collection.GenTraversableOnce[B].
              m.flatten
                ^

scala> val m = Map(1 -> List(1,2,3), 2 -> List(4,5,6), 4 -> List(7,8,9))
m: scala.collection.immutable.Map[Int,List[Int]] = Map(1 -> List(1, 2, 3), 2 -> List(4, 5, 6), 4 -> List(7, 8, 9))

scala> m.flatten
<console>:9: error: No implicit view available from (Int, List[Int]) => scala.collection.GenTraversableOnce[B].
              m.flatten
                ^
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

ale*_*bit 4

问题在于编译器不“知道”如何解释您存储在映射中的元素。也就是说,解释并不明显,因此您必须将您自己的元素的隐式视图提供为可遍历的。例如,对于您提供的情况,您希望将类型映射的每个元素解释(Int, List[Int])为一个新的元组列表,其中第一个元素是原始元素键,值是给定键中最初的每个值\ 的值。在代码中:

\n\n
implicit val flattener = (t: (Int,List[Int])) \xe2\x87\x92 t._2.map(x \xe2\x87\x92 (t._1, x))\n\nval m = Map(1 \xe2\x86\x92 List(1, 2, 3), 2 \xe2\x86\x92 List(4, 5), 3 \xe2\x86\x92 List(6))\nval fm = m.flatten\n
Run Code Online (Sandbox Code Playgroud)\n\n

但你必须自己提供“扁平化”功能。

\n