加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

读者作家状态monad – 如何运行这个scala代码

发布时间:2020-12-16 09:32:23 所属栏目:安全 来源:网络整理
导读:托尼·莫里斯(Tony Morris)与这个 snippet发表了讲话。 他使用ReaderWriterState monad来提供对隐式上下文的受控读/写访问。这就说得通了。 如何使用代码?我想看一个使用这个monad的例子“main”程序。 解决方法 Scalaz 7现在提供这个monad,以下是一个完整
托尼·莫里斯(Tony Morris)与这个 snippet发表了讲话。

他使用ReaderWriterState monad来提供对隐式上下文的受控读/写访问。这就说得通了。

如何使用代码?我想看一个使用这个monad的例子“main”程序。

解决方法

Scalaz 7现在提供这个monad,以下是一个完整的工作示例,翻译与 the example by Michael Pilquist中的小修订,在上面的评论中链接。

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[Identity]
    }

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

  val program: RWS[Config,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 Need(logMessages,result,invocationCount) = program run (Config(443),0)
  println("Result: " + result)
  println("Service invocations: " + invocationCount)
  println("Log: %n%s".format(logMessages.mkString("t","%nt".format(),"")))
}

这是针对Scalaz 7.0.0-M3测试的,它是从Maven的中央存储库中的easily available作为Maven或SBT依赖关系。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读