2011-05-14 27 views
14

Encontré una buena article, alrededor de call with current continuation patrones. Según tengo entendido, usan Scheme y undelimited continuations. ¿Pueden implementarse los patrones del artículo en Scala? ¿Hay algún artículo sobre los patrones delimited continuations en Scala?patrones "call-cc" en Scala?

Respuesta

13

Sí, absolutamente pueden. callCC es la siguiente con 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) 

Dónde Cont es una estructura de datos que captura una continuación:

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)))) 
} 

Así es como usted puede utilizarlo para simular excepciones comprobadas:

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) 

Llamaría a esta función de la siguiente manera:

scala> divExcpt(10, 2, error) run println 
5 

scala> divExcpt(10, 0, error) run println 
java.lang.RuntimeException: Denominator 0 
3

Scala tiene una implementación de continuaciones delimitadas mecanografiadas que solía enviarse con el compilador y la biblioteca estándar, pero se ha extraído a external module y casi se deja pudrir desde entonces. Es una gran lástima, y ​​animo a todos los que estén interesados ​​en continuaciones delimitadas a demostrar que se preocupan por su existencia al usar y contribuir a ella.

Cuestiones relacionadas