【发布时间】:2017-01-30 21:10:02
【问题描述】:
对于表示自然数的数据类型:
sealed trait Nat
case object Z extends Nat
case class S(pred: Nat) extends Nat
在 Scala 中,这是实现相应catamorphism 的基本方法:
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 的路线,除非代码最终呈现的界面看起来和上面一样简单。
编辑:看起来这可能直接相关:Is it possible to use continuations to make foldRight tail recursive?
【问题讨论】:
-
不应该像这样制作 cmets,但到底是什么......“有趣的问题”。期待回复。
标签: scala algebraic-data-types category-theory recursion-schemes catamorphism