scala - 如何在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)
累加器的初始值,因为它可能会作为实际值出现。
解决方案
除了 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
编译器能够识别出正确的类型。
推荐阅读
- python - 将 PostgreSQL 输出参数返回给 Python 会返回预先提交的值
- pytorch - 这个函数是如何通过切片来遍历token的,你能解释一下它是如何选择列表中的元素的吗?
- .htaccess - .htaccess 问题与 url
- python - 如何从 Python QuerySet 中检索值?
- python - 是否可以通过 API 将 Google Ads 自定义报告加载到生产数据库中
- python - Django 记录锁定和原子事务
- javascript - Google 的 People Api:无法从 Vuejs 应用程序获取组织信息
- react-native - 如何修改/替换 mobx-state-tree 中的所有存储?
- r - 如何知道我的数据是否遵循 R 中的两个参数或三个参数对数正态分布
- ionic-framework - 通过 id 检索文档时的 Firestore 安全性拒绝权限