Die freie Implementierung in Haskell ist:Freie Implementierung in scalaz
data Free f a =
Pure a
| Free (f (Free f a))
während der Umsetzung in Scalaz ist:
sealed abstract class Free[S[_], A]
private case class Return[S[_], A](a: A) extends Free[S, A]
private case class Suspend[S[_], A](a: S[A]) extends Free[S, A]
private case class Gosub[S[_], B, C](a: Free[S, C], f: C => Free[S, B]) extends Free[S, B]
warum nicht die scalaz Implementierung ist ähnlich wie Haskell, wie:
sealed trait Free[F[_],A]
case class Return[F[_],A](a: A) extends Free[F,A]
case class GoSub[F[_],A](s: F[Free[F,A]]) extends Free[F,A]
Sind diese beiden Implementierungen isomorph?
Wie würden Sie mit der zweiten Scala-Implementierung ein 'Free [F, A]' mit einem 'F [A]' erzeugen? –
@PeterNeyens das ist sehr gut möglich, wenn 'F' ein' Functor' ist. Das Problem bei einer solchen Darstellung besteht darin, dass es zu Stack-Sicherheitsproblemen führt. –
@TomasMikula. Ok ich sehe 'GoSub [F, A] (F.map (fa) (Zurück [F, A] (_)))', danke! –