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

我正在寻找类似于optionTpoint组合的功能,但对于作家而言:

例如。

// 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] = ???

最佳答案

某些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变压器时必须习惯的。

关于scala - 从作家[WITH,A]创建作家OF,W,A],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35362240/

10-10 16:46