L'implementazione libera in Haskell è:implementazione libera in scalaz
data Free f a =
Pure a
| Free (f (Free f a))
, mentre, l'implementazione in Scalaz è:
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]
perché non è l'implementazione scalaz simile a Haskell, come:
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]
Queste due implementazioni sono isomorfe?
Come creeresti un 'Free [F, A]' dato un 'F [A]' usando la seconda implementazione di Scala? –
@PeterNeyens che è molto ben possibile quando 'F' è un' Functor'. Il problema con tale rappresentazione è che porta a problemi di sicurezza dello stack. –
@TomasMikula. Ok vedo 'GoSub [F, A] (F.map (fa) (Return [F, A] (_))), grazie! –