【问题标题】:"call-cc" patterns in Scala?Scala中的“call-cc”模式?
【发布时间】:2011-08-25 13:25:44
【问题描述】:

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

【问题讨论】:

    标签: scala continuations


    【解决方案1】:

    Scala 有一个类型化分隔延续的实现,它曾经随编译器和标准库一起提供,但已被提取到 external module 并从那时起几乎被腐烂。太可惜了,我鼓励任何对定界延续感兴趣的人通过使用和贡献来表明他们关心它的存在。

    【讨论】:

      【解决方案2】:

      是的,他们绝对可以。 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
      

      【讨论】:

        猜你喜欢
        • 2015-04-13
        • 2011-02-16
        • 2016-03-21
        • 1970-01-01
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-22
        • 2010-12-15
        相关资源
        最近更新 更多