二叉树总和与Scala分隔连续

时间:2016-05-31 10:22:09

标签: scala tree tail-recursion continuations delimited-continuations

我正在玩Scala,我从一些简单的例子开始,比如实现二叉树。事先了解函数式编程(OCaml,F#),我试图复制使用continuation的常用方法,以便使二叉树遍历尾递归。 我正在尽可能多地阅读Scala的Delimited Continuations,但我无法让它发挥作用。

您可以从this StackOverflow question

中读取此行为的OCaml实现

我按照 Introduction to Programming with Shift and Reset 中的示例进行了操作,但我总是遇到类型错误以及我为使其工作而做出的修改,给出了正确的结果,但没有使函数尾递归的。

这是我的实施

abstract class IntTree
case object EmptyTree extends IntTree
case class Node( value : Int, left : IntTree, right : IntTree) extends IntTree

abstract class Result
case object Done extends Result
case class Next( n:Int, f : ( Unit => Result ) ) extends Result

def Sum(tree: IntTree): Int = {
  def walk( t : IntTree) : Unit = t match {
    case EmptyTree => ()
    case Node(v, left, right) => {
      walk(left)
      reset {
        shift { k: (Unit => Result) => Next(v, k) }
        walk(right)
      }
    }
  }
  def start( t : IntTree) = { walk(t); Done }
  def sumResult( ls : Result, acc : Int) : Int = ls match {
    case Done => acc
    case Next(value, k) => {
      sumResult(k(), acc + value)
    }
  }


  sumResult( start(tree), 0 )
}

我也想知道Delimited Continuations是否适合这项工作。我知道这个问题可以通过显式堆栈有效地解决,但我想了解如何在Scala中使用cps。

0 个答案:

没有答案