continuation monad 2

本文介绍了一个用Scala实现的Monads库,重点展示了如何通过Monads处理连续操作,并使用callCC实现类似goto的功能。代码示例中包括了基本的数学运算和控制流程的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

续:

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)
  }     

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值