scala - Scala 集合库中的 TraversableOnce MonadOps
问题描述
我正在查看 Scala 2.12 Collection Library 源代码并注意到以下内容:
trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
//methods
implicit class MonadOps[+A](trav: TraversableOnce[A]) {
def map[B](f: A => B): TraversableOnce[B] = trav.toIterator map f
def flatMap[B](f: A => GenTraversableOnce[B]): TraversableOnce[B] = trav.toIterator flatMap f
def withFilter(p: A => Boolean) = trav.toIterator filter p
def filter(p: A => Boolean): TraversableOnce[A] = withFilter(p)
}
}
Monad Opsimplicit
上课的原因是什么?的Traversable
子特征TraversableOnce
将所有单子方法定义为不作为 imlpicit 类(TraversableLike
尽管如此)。
解决方案
Iterator
,作为我们只希望遍历一次的东西,是一个扩展TraversableOnce
而不扩展的例子Traversable
。on 的方法MonadOps
将在那里使用。
注意MonadOps
在伴随对象中,而不是在特征中。
另请注意TraversableOnce
,在 2.13.0 中已弃用,取而代之的是IterableOnce
.
推荐阅读
- arrays - 在C中对数组中大于n的元素进行升序排序并以降序排序
- r - seq(0, 1, length.out = 10) 对于以下输出是否正确?[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
- windows - 在互联网连接不佳的教室中安装 VSCODE 的最佳实践
- nim-lang - Nim-Lang:如何在过程中接受任意数量的参数
- javascript - 从一个数组中获取一些不同的随机元素,(每次不设置不同的变量)
- python - Subprocess.popen - 如何一次只运行一个进程
- node.js - 使用nodejs格式化对象数组
- javascript - 函数接收来自两个不同来源的参数
- android - Android Widget按钮服务不响应点击
- django-models - 在 Django 模型中反转外键关系会导致问题吗?