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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |