从作家[W,A]创建一个WriterT [F,W,A]

时间:2016-02-12 12:05:40

标签: scala monads scalaz monad-transformers

在Scalaz中,有一种简单的方法可以将Writer[W, A]的实例(WriterT[Id, W, A])的别名转换为WriterT[F, W, A]吗?

我正在寻找类似optionT函数与point相结合的内容,但是对于作者而言:

E.g。

// Similar situation, but using OptionT
val opt:  Option[String] = Some("log")
val optT: OptionT[IO, String] = optionT(opt.point[IO])

// Case in hand, using WriterT
val w:  Writer[String, Unit] = "log".tell
val wt: WriterT[IO, String, Unit] = ???

// Similar scenario
val w:  Writer[String, Int] = 3.set("log")
val wt: WriterT[IO, String, Int] = ???

1 个答案:

答案 0 :(得分:5)

一些monadic类型有lift个方法可以帮助进行这种操作:

import scalaz._, Scalaz._, effect.IO

val stateIO: StateT[IO, Int, Unit] = put(10).lift[IO]

Writer没有,但您可以使用Hoist WriterT实例来完成同样的事情:

type StringWriter[F[_], A] = WriterT[F, String, A]

def fromId[F[_]: Applicative]: Id ~> F = new (Id ~> F) {
  def apply[A](a: A) = a.point[F]
}

val w:  Writer[String, Unit] = "log".tell
val wt: WriterT[IO, String, Unit] = Hoist[StringWriter].hoist(fromId[IO]).apply(w)

这不是非常方便,但在使用monad变换器时,你必须习惯这一点。