首页 > 解决方案 > 如何在Scala foldLeft中使累加器成为空的Int集?

问题描述

我目前在 Scala 中有一个大于 1 的 Set :

val x = BitSet(19, 49)
val z = HashMap(49 -> HashSet(5, 6, 9, 13, 3, 8, 4), 19 -> Set(5, 9, 14))类型Map[Int,Set[Int]]

我正在尝试使用 foldLeft 构造一个Set[Int]与元素关联的所有值Set x,最终结果将是:HashSet(5, 6, 9, 13, 3, 8, 4, 14),但我无法将累加器正确设置为Set[Int].

我没有使用x.foldLeft(Set(0))((acc, elem) => acc.union(z(elem)))然后0从最终集合中删除该元素。

我试过了x.foldLeft(Set.empty)((acc, elem) => acc.union(z(elem)))

type mismatch found   : 
Set[Int]     (in scala.collection.immutable) 
required: Set[Nothing] (in scala.collection) 

我什至尝试创建一个空Set[Int]变量作为变量并在折叠表达式中使用它,但它也没有用。我不能保留Set(0)累加器的初始值,因为它可能会作为实际值出现。

标签: scalafunctional-programmingsetfoldleft

解决方案


除了 1 个小错误,代码完全没问题。x.foldLeft(Set.empty)((acc, elem) => acc.union(z(elem)))

有一些方法可以解决这个问题:

1. x.foldLeft(Set.empty[Int])((acc, elem) => acc.union(z(elem)))
2. x.foldLeft[Set[Int]](Set.empty)((acc, elem) => acc.union(z(elem)))

TL;博士

如果我们深入挖掘 scala 代码,这就是foldleft

def foldLeft[B](z: B)(op: (B, A) => B): B

这个 curry 函数有 2 个部分,其中第一个def foldLeft[B](z: B)部分包含op将在迭代期间应用的部分。

让我们了解编译器将如何推断泛型。 x.foldLeft[?](Set.empty[?])这里的Set.empty问号将被替换为默认值Nothing,但在ops函数中,参数acc的类型为 Set[int]。这将导致类型不匹配。

要解决编译问题,我们需要在 foldLeft 中提供类型参数Set.empty或在 foldLeft 之前显式提供类型,以便Set.empty编译器能够识别出正确的类型。


推荐阅读