2016-02-12 79 views
2

在Scalaz,有一個簡單的方法來轉換的Writer[W, A]一個實例(這是WriterT[Id, W, A])WriterT[F, W, A]創建WriterT [F,W,A]從文學家[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] = ??? 

回答

5

一些單子類型有lift方法與此ķ幫助操作IND:

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變壓器時。

+0

輝煌,謝謝!是的,monad變形金剛會是一種痛苦... – dcastro

相關問題