续:
M的实现见 http://lamp.epfl.ch/~emir/bqbase/2005/01/20/monad.html
package continuations
object AddMonad {
case class M[+A](in: (A=>Any)=>Any) {
def apply(f:A=>Any) = in(f)
def map[B](f: A => B):M[B] = bind(this, {x: A => unit(f(x))} )
def flatMap[B](f: A => M[B]):M[B] = bind(this, f)
}
def bind[A,B](m:M[A], f:A=>M[B]):M[B] =
M(k => m.in (x => f(x).in(k)))
def unit[A](x:A):M[A] = M( {k:(A=>Any) => k(x)} )
def callCC[A](e:(A=>M[A])=>M[A]):M[A] =
M(k => e(a => M(ignored => k(a))).in(k))
def main(args : Array[String]) : Unit = {
val s=for{
m1 <- unit(3)
m2 <- unit(7)
m3 = m1*m2
m4 <- unit(9)
m5 = m3+m4
m6 <- unit(12)
m7 = m5 + m6
} yield(m7)
s(println)
}
}
和callCC:
def myGoto(x:Int) =
callCC[Int](label1 =>
callCC[Int](label2 =>
callCC[Int](label3=>
callCC[Int](label4=>
if (x==1) label1(x)
else if (x==2) label2(x)
else if (x==3) label3(x)
else label4(x)
)
)
)
)
def main(args : Array[String]) : Unit = {
val m = myGoto(1)
m(println)
}