Я пытаюсь написать функцию foldTerm
из Типы данных аля карт в Scala. Вот что у меня есть
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
, но все мои попытки закончились разочарованием.
Что мне не хватает?