14

パターンについての良い記事を見つけました。call with current continuation私が理解しているように、彼らはSchemeとを使用していますundelimited continuations。記事のパターンをScalaで実装できますか?delimited continuationsScalaのパターンに関する記事はありますか?

4

2 に答える 2

13

はい、絶対にできます。callCCScalaでは次のようになります。

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 に答える