【发布时间】:2016-06-10 07:27:46
【问题描述】:
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]
这两个实现是同构的吗?
【问题讨论】:
-
在给定
F[A]使用第二个 Scala 实现的情况下,您将如何创建Free[F, A]? -
@PeterNeyens 当
F是Functor时很有可能。这种表示的问题在于它会导致堆栈安全问题。 -
@TomasMikula。好的,我看到
GoSub[F, A](F.map(fa)(Return[F, A](_))),谢谢!
标签: scala scalaz free-monad