18

TonyMorrisがこのスニペットで講演しました。

彼はReaderWriterStateモナドを使用して、暗黙的なコンテキストへの制御された読み取り/書き込みアクセスを提供しています。それは理にかなっている。

コードを使用するにはどうすればよいですか?このモナドを使用した「メイン」プログラムの例を見てみたいと思います。

4

1 に答える 1

19

Scalaz 7はこのモナドを提供するようになりました。以下は完全に動作する例で、上記のコメントでリンクされているMichael Pilquist による例からマイナーな修正を加えて翻訳されています。

package scalaz.example

import scalaz._, Scalaz._


object RWSExample extends App {
  case class Config(port: Int)

  def log[R, S](msg: String): ReaderWriterState[R, List[String], S, Unit] =
    ReaderWriterStateT {
      case (r, s) => (msg.format(r, s) :: Nil, (), s).point[Id]
    }

  def invokeService: ReaderWriterState[Config, List[String], Int, Int] =
    ReaderWriterStateT {
      case (cfg, invocationCount) => (
        List("Invoking service with port " + cfg.port),
        scala.util.Random.nextInt(100),
        invocationCount + 1).point[Id]
    }

  val program: RWS[Config, List[String], Int, Int] = for {
    _ <- log("Start - r: %s, s: %s")
    res <- invokeService
    _ <- log("Between - r: %s, s: %s")
    _ <- invokeService
    _ <- log("Done - r: %s, s: %s")
  } yield res

  val (logMessages, result, invocationCount) = program run (Config(443), 0)
  println("Result: " + result)
  println("Service invocations: " + invocationCount)
  println("Log: %n%s".format(logMessages.mkString("\t", "%n\t".format(), "")))
}

これは、Maven または SBT の依存関係として Maven の中央リポジトリから簡単に入手できるScalaz 7.2.18 に対してテストされています。

于 2012-09-19T21:09:17.113 に答える