加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的“call-cc”模式?

发布时间:2020-12-16 09:18:06 所属栏目:安全 来源:网络整理
导读:我发现一个很好的 article,关于当前的连续模式的呼叫.据了解,他们使用计划和无限制的延续.文章中的模式可以在Scala中实现吗?有没有关于Scala中分隔延续模式的文章? 解决方法 是的,他们绝对可以. callCC在Scala中看起来像这样: def callCC[R,A,B](f: (A =
我发现一个很好的 article,关于当前的连续模式的呼叫.据了解,他们使用计划和无限制的延续.文章中的模式可以在Scala中实现吗?有没有关于Scala中分隔延续模式的文章?

解决方法

是的,他们绝对可以. callCC在Scala中看起来像这样:

def callCC[R,A,B](f: (A => Cont[R,B]) => Cont[R,A]): Cont[R,A] =
  Cont(k => f(a => Cont(_ => k(a))) run k)

Cont是一个捕获延续的数据结构:

case class Cont[R,A](run: (A => R) => R) {
  def flatMap[B](f: A => Cont[R,B]): Cont[R,B] =
    Cont(k => run(a => f(a) run k))
  def map[B](f: A => B): Cont[R,B] =
    Cont(k => run(a => k(f(a))))
}

以下是您如何使用它来模拟检查的异常:

def divExcpt[R](x: Int,y: Int,h: String => Cont[R,Int]): Cont[R,Int] =
  callCC[R,Int,String](ok => for {
    err <- callCC[R,String,Unit](notOK => for {
             _ <- if (y == 0) notOK("Denominator 0") else Cont[R,Unit](_(()))
             r <- ok(x / y)
           } yield r)
    r <- h(err)
  } yield r)

你可以这样调用这个函数:

scala> divExcpt(10,2,error) run println   
5

scala> divExcpt(10,error) run println
java.lang.RuntimeException: Denominator 0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读