根据我的理解,如果Foo是monad,那么它也可以被证明是functor。但是,我不明白为什么在免费monad中,如果F是仿函数,Free in Free [F [_],A]是monad,所以我们可以使用monadic操作来编写代码。
我在阅读此博客http://underscore.io/blog/posts/2015/04/14/free-monads-are-simple.html
时提出了这个问题在scalaz中,Coyoneda正在使用类型类来呈现Functor。
type Functor = Coyoneda[Action, A]
因此,如果提供Coyoneda实现,Free [Functor,A]是monad。
这是我为简单代码编写的代码。它的工作非常酷,所以我们将执行和解释器分开,但为什么Free会成为" free"
的monad//data type
sealed trait Action[A]
case class IntOption(number: Int) extends Action[Int]
//implements functor, AKA interpretor
type ScriptImpl[A] = Coyoneda[Action, A]
object Interpreter extends (Action ~> Option) {
override def apply[A](a: Action[A]): Option[A] = {
a match {
case IntOption(t) => Option(t)
}
}
}
//lift to free monad
def toFree[A](a: Action[A]): Free[ScriptImpl, A] = Free.liftFC[Action, A](a)
val result: Free[ScriptImpl, Int] = for {
a <- toFree(IntOption(1))
b <- toFree(IntOption(2))
c <- toFree(IntOption(3))
} yield {
a + b + c
}
println(Free.runFC(result)(Interpreter))