Бесплатная реализация на Haskell:
data Free f a =
Pure a
| Free (f (Free f a))
тогда как реализация в 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]
почему реализация scalaz не похожа на Haskell, например:
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]
Являются ли эти обе реализации изоморфными?
Free[F, A]
с учетомF[A]
, используя вторую реализацию Scala? - person Peter Neyens   schedule 10.06.2016F
являетсяFunctor
. Проблема с таким представлением заключается в том, что оно приводит к проблемам с безопасностью стека. - person Tomas Mikula   schedule 10.06.2016GoSub[F, A](F.map(fa)(Return[F, A](_)))
, спасибо! - person Peter Neyens   schedule 10.06.2016