为什么"免费"如果F是Free [F [_],A]中的函子,则为monad

时间:2015-07-12 14:08:10

标签: scala functional-programming scalaz free-monad

根据我的理解,如果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))

0 个答案:

没有答案