我正在玩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。