Написание foldTerm из «Типы данных на выбор» в Scala

Я пытаюсь написать функцию 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, но все мои попытки закончились разочарованием.

Что мне не хватает?

5
задан purefn 13 July 2012 в 01:48
поделиться