Related to : Random as instance of scalaz.Monad

How to send a process to multiple sinks in scalazstream 
You could also use observe and to to attach multiple Sinks to a
Process:
val p = io.stdInLines.observe(out1).to(out2)
observe is like to but echoes what is passed into the sink. So
io.stdInLines.observe(out1) still emits the strings that come from
stdin (that means it is of type Process[Task, String]) but also sends
them to the sink out1.
As Eric pointed out, it is also possible to zip Sinks

Recursion in a monad 
In this particular case, you can just unfold completely. Perhaps this
helps:
f 3
= { reduce f (and the subtraction) }
do v < getLine
vs < f 2
return $! v : vs
= { reduce f (and the subtraction) }
do v < getLine
vs < do v' < getLine
vs' < f 1
return $! v' : vs'
return $! v : vs
= { reduce f (and the subtraction

Is Scala Either really a Monad 
Yes, it really is  otherwise it would be in scalazoutlaws. Either's
bind is defined something like:
trait Either[A, B] {
def bind[C](f: B => Either[A, C]) = this match {
case Right(b) => f(b)
case Left(a) => Left(a)
}
}
(in practice it's defined via a typeclass, but the above definition
would work)
I guess it's more proper to say that for a fixed A, the type ({type
L[B]=

Is there a lazy Session IO Monad? 
I don't think you can do exactly what you want, since what you
describe exploits haskell's lazy evaluation to have the evaluation of
a force the actions that compute b and c, and there's no way to seq on
unspecified values.
What I could do was hack together a monad transformer that delayed
actions sequenced via >> so that they could be executed all
together:
data Session m a = Session { pe

Shortcircuit AND within IO Monad 
The operation you want is simple to define explicitly.
shortCircuitAnd :: Monad m => m Bool > m Bool > m Bool
shortCircuitAnd x y = do
r1 < x  perform effect of x
if r1
then y  perform effect of y and return result
else return False  do *not* evaluate or perform effect of y
Of course, you can use this function infix as well, using backticks:
x `shortCircu
