Scala集合库中的TraversableOnce MonadOps

时间:2019-06-24 18:38:28

标签: scala collections traversable

我正在查看Scala 2.12集合库的源代码,并注意到以下内容:

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 Ops归入implicit类的原因是什么? Traversable的{​​{1}}子特征将这所有单子方法都定义为不是隐式类(尽管通过TraversableOnce)。

1 个答案:

答案 0 :(得分:1)

Iterator(我们只希望遍历一次)是扩展TraversableOnce而未扩展Traversable的示例。 MonadOps上的方法将在那里使用。

注意MonadOps在伴随对象中,而不是特征。

另外请注意,{2.1中已弃用TraversableOnce,而推荐使用IterableOnce