私はモナド変圧器でscalaz
で遊んでいます。私は基盤のId
モナドと一緒にリーダーの上にライターを積み重ねようとしています。それらを組み合わせるために、私はMonadReader
とMonadWriter
タイプのクラスを使用しています。ReaderTとWriterTトランスをscalazに積み重ねる方法は?
私は(ReaderT[Id.Id, String, A]
すなわち、すなわちReader
モナドで)せずに次のコードサンプルをコンパイルして実行するためにライターを管理していました。スタックに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'などはすべて良い候補です。 –