Шаблоны "call-cc" в Scala? - PullRequest
14 голосов
/ 14 мая 2011

Я нашел хорошую статью , о call with current continuation шаблонах. Как я понимаю, они используют Scheme и undelimited continuations. Могут ли шаблоны из статьи быть реализованы в Scala? Есть ли статья о delimited continuations шаблонах в Scala?

Ответы [ 2 ]

13 голосов
/ 15 мая 2011

Да, они абсолютно могут.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
3 голосов
/ 20 апреля 2016

В Scala есть реализация типизированных продолжений с разделителями, которые раньше поставлялись вместе с компилятором и стандартной библиотекой, но были извлечены во внешний модуль и с тех пор оставались практически без изменений.Это позор, и я призываю всех, кто интересуется продолжениями с разделителями, показать, что они заботятся о его существовании, используя его и внося в него свой вклад.

...