14

我找到了一篇关于模式的好文章。call with current continuation据我了解,他们使用 Scheme 和undelimited continuations. 文章中的模式可以在 Scala 中实现吗?有没有关于delimited continuationsScala 模式的文章?

4

2 回答 2

13

是的,他们绝对可以。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, 0, error) run println
java.lang.RuntimeException: Denominator 0
于 2011-05-14T20:55:14.330 回答
3

Scala 有一个类型化的分隔延续的实现,它曾经随编译器和标准库一起提供,但已经被提取到一个外部模块中,并且从那时起几乎被腐烂了。这是一个巨大的耻辱,我鼓励任何对分隔延续感兴趣的人通过使用和贡献来表明他们关心它的存在。

于 2016-04-20T11:17:54.920 回答