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
が、私の試みはすべて欲求不満に終わりました。
私は何が欠けていますか?