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