Back to Fpinscala

03.Answer

answerkey/iomonad/03.answer.md

latest299 B
Original Source
scala
// As a method on Free:
def run[F2[x] >: F[x]](using F: Monad[F2]): F2[A] = step match
  case Return(a) => F.unit(a)
  case Suspend(fa) => fa
  case FlatMap(Suspend(fa), f) => fa.flatMap(a => f(a).run)
  case FlatMap(_, _) => sys.error("Impossible, since `step` eliminates these cases")