我正在尝试从Scala 中的Data Types ala CartefoldTerm
编写函数。这是我到目前为止所得到的
def foldTerm[F[+_], A, B](e: Free[F, A], pure: A ⇒ B, imp: F[B] ⇒ B)(implicit F: Functor[F]): B =
e.resume match {
case Right(a) ⇒ pure(a)
case Left(x) ⇒ imp(F.map(x)(foldTerm(_, pure, imp)))
}
这可行,但由于 Scala 无法正确优化尾递归,它会导致 SOE。我试图修复它,Trampoline
但到目前为止还没有任何运气。我觉得我应该能够使用现有的方法来做到这一点,Free
但我所有的尝试都以失败告终。
我错过了什么?