7
在Haskell自由的實現是:在scalaz免費實施
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實施哈斯克爾,如:
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]
這兩種實現是同構的嗎?
如果使用第二個Scala實現給出一個'F [A]',你會如何創建一個'Free [F,A]? –
@PeterNeyens,當'F'是'Functor'時,這是非常有可能的。這種表示的問題在於它會導致堆棧安全問題。 –
@TomasMikula。好的,我看到'GoSub [F,A](F.map(fa)(Return [F,A](_))'',謝謝! –