对于表示自然数的数据类型:
sealed trait Nat
case object Z extends Nat
case class S(pred: Nat) extends Nat
在Scala中,这是一种实现相应范畴折叠的基本方法:
def cata[A](z: A)(l: Nat)(f: A => A): A = l match {
case Z => z
case S(xs) => f( cata(z)(xs)(f) )
}
然而,由于对cata的递归调用不在尾部位置,这很容易触发堆栈溢出。
有哪些替代实现选项可以避免这种情况?除非代码最终呈现的接口与上述内容几乎一样简单,否则我不想采取F-algebras的方法。
编辑:看起来这可能是直接相关的:使用continuations使foldRight成为尾递归是否可能?