You could always define your own trace
function:
def trace[T](x: T) = {
println(x) // or your favourite logging framework :)
x
}
Then the for comprehension would look like:
for {
outer <- ll
inner <- trace(outer)
} yield inner
Alternatively, if you want more information printed, you can define trace
as follows:
def trace[T](message: String, x: T) = {
println(message)
x
}
and the for comprehension would look like:
for {
outer <- ll
inner <- trace("Value: " + outer, outer)
} yield inner
EDIT: In response to your comment, yes, you can write trace
so that it acts to the right of the target! You just have to use a bit of implicit trickery. And actually, it does look much nicer than when applied to the left :).
To do this, you have to first define a class which is Traceable
and then define an implicit conversion to that class:
class Traceable[A](x: A) {
def traced = {
println(x)
x
}
}
implicit def any2Traceable[A](x: A) = new Traceable(x)
Then the only thing you have to modify in the code you have provided is to add traced
to the end of the value you want to be traced. For example:
for {
outer <- ll
inner <- outer traced
} yield inner
(this is translated by the Scala compiler into outer.traced
)
Hope it helps :)
-- Flaviu Cipcigan