У меня есть этот код:
object Peek {
implicit def traversableToPeek[A](underlying: Traversable[A]) = new Peek(underlying)
}
class Peek[A](underlying: Traversable[A]) {
/**
* Java-style peek method
*/
def peek(func: A => Unit): Traversable[A] = {
underlying.foreach(func)
underlying
}
}
, в то время как позволяет мне писать такие вещи, как List(1,2,3).peek(println).map(_+1).peek(println)
, который печатает 1,2,3, а затем 2,3,4 (после import Peek._
)
Однако значение времени компиляции этого выражения равно Traversable[Int]
. Это означает, что хотя этот код компилируется:
val l = List(1,2,3)
val l2 = 4 :: l
, этот код не:
val l = List(1,2,3).peek(println)
val l2 = 4 :: l
, поскольку ::
не определено в Traversable
. Цель peek состоит в том, чтобы разрешить операции только с побочными эффектами, не требуя несколько уродливых конструкций, таких как l.map(e => println(e); e)
Я попытался добавить второй универсальный параметр T <: Traversable
или T[A] <: Traversable[A]
, но не смог его скомпилировать таким образомгде неявное преобразование работало.
Мне кажется, это возможно, но я недостаточно знаком со Scala, чтобы получить правильный синтаксис.