首页 > 解决方案 > 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尽管如此)。

标签: scalacollectionstraversable

解决方案


Iterator,作为我们只希望遍历一次的东西,是一个扩展TraversableOnce而不扩展的例子Traversable。on 的方法MonadOps将在那里使用。

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

另请注意TraversableOnce,在 2.13.0 中已弃用,取而代之的是IterableOnce.


推荐阅读