我正在玩scalaz
的monad變形金剛。我正在試圖將一個Writer與底層的Id
monad堆疊在一起。爲了組合它們,我使用了MonadReader
和MonadWriter
類型類。如何在scalaz中堆疊ReaderT和WriterT變換器?
我設法編譯和運行下面的代碼示例而不作家(即與Reader
單子,即ReaderT[Id.Id, String, A]
)。當添加WriterT
到堆棧中,我得到的編譯錯誤:
Gist.scala:10: could not find implicit value for parameter F: scalaz.MonadReader[Gist.R,String]
val MR = MonadReader[R, String]
^
我怎樣才能獲得的MonadReader
實例爲我的變壓器棧?我必須使用ReaderWriterStateT
還是有另一種方式?
全碼:
import scalaz.{Id, MonadListen, MonadReader, ReaderT, WriterT}
object Gist {
import scalaz.std.list._
import scalaz.syntax.monad._
type P[A] = ReaderT[Id.Id, String, A]
type R[A] = WriterT[P, List[String], A]
val MR = MonadReader[R, String]
val MW = MonadListen[R, List[String]]
def apply: R[String] = MR.ask >>= { greeting =>
MW.tell(List(s"greeting $greeting")) >>= { _ =>
MW.point(s"Hello $greeting")
}
}
}
就像一個魅力。爲了教學目的,你能想到另一個沒有'scalaz'實現的變壓器棧/類型組合,所以我可以練習編寫我自己的實現嗎? – mgryszko
@mgryszko你可以看到Haskell的mtl [here](https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-Reader-Class.html)-'StateT'的列表, 'ListT','ContT','EitherT','IdT'等都是不錯的選擇。 –