从 Writer[W, A] 创建 WriterT[F, W, A]
Creating a WriterT[F, W, A] from a Writer[W, A]
在 Scalaz 中,是否有一种简单的方法可以将 Writer[W, A]
(WriterT[Id, W, A])
的别名)的实例转换为 WriterT[F, W, A]
?
我正在寻找类似于 optionT
函数与 point
相结合的东西,但对于作家来说:
例如
// 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
没有,但是您可以使用 WriterT
的 Hoist
实例来完成同样的事情:
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 转换器时必须习惯的事情。
在 Scalaz 中,是否有一种简单的方法可以将 Writer[W, A]
(WriterT[Id, W, A])
的别名)的实例转换为 WriterT[F, W, A]
?
我正在寻找类似于 optionT
函数与 point
相结合的东西,但对于作家来说:
例如
// 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
没有,但是您可以使用 WriterT
的 Hoist
实例来完成同样的事情:
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 转换器时必须习惯的事情。