Scala 集合库中的 TraversableOnce MonadOps
TraversableOnce MonadOps in Scala collection library
我正在查看 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 Ops 放入 implicit
class 中的原因是什么? TraversableOnce
的 Traversable
子特征将所有 monadic 方法定义为 imlpicit class(虽然通过 TraversableLike
)。
Iterator
作为我们只希望遍历一次的东西,是扩展 TraversableOnce
而不扩展 Traversable
的例子。 MonadOps
上的方法将在那里使用。
注意 MonadOps
在伴随对象中,而不是特征中。
另请注意 TraversableOnce
在 2.13.0 中已弃用,取而代之的是 IterableOnce
。
我正在查看 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 Ops 放入 implicit
class 中的原因是什么? TraversableOnce
的 Traversable
子特征将所有 monadic 方法定义为 imlpicit class(虽然通过 TraversableLike
)。
Iterator
作为我们只希望遍历一次的东西,是扩展 TraversableOnce
而不扩展 Traversable
的例子。 MonadOps
上的方法将在那里使用。
注意 MonadOps
在伴随对象中,而不是特征中。
另请注意 TraversableOnce
在 2.13.0 中已弃用,取而代之的是 IterableOnce
。