设为首页 加入收藏

TOP

Scalaz(18)- Monad: ReaderWriterState-可以是一种简单的编程语言(四)
2017-10-10 12:13:28 】 浏览:4929
Tags:Scalaz Monad ReaderWriterState- 可以 简单 编程语言
: ReaderWriterStateT[F, R, W, S, S]
= ReaderWriterStateT((_, s) => F.point((W.zero, s, s))) def get = init def put(s: S): ReaderWriterStateT[F, R, W, S, Unit] = ReaderWriterStateT((r, _) => F.point((W.zero, (), s))) override def modify(f: S => S): ReaderWriterStateT[F, R, W, S, Unit] = ReaderWriterStateT((r, s) => F.point((W.zero, (), f(s)))) override def gets[A](f: S => A): ReaderWriterStateT[F, R, W, S, A] = ReaderWriterStateT((_, s) => F.point((W.zero, f(s), s))) def writer[A](w: W, v: A): ReaderWriterStateT[F, R, W, S, A] = ReaderWriterStateT((_, s) => F.point((w, v, s))) override def tell(w: W): ReaderWriterStateT[F, R, W, S, Unit] = ReaderWriterStateT((_, s) => F.point((w, (), s))) def listen[A](ma: ReaderWriterStateT[F, R, W, S, A]): ReaderWriterStateT[F, R, W, S, (A, W)] = ReaderWriterStateT((r, s) => F.map(ma.run(r, s)) { case (w, a, s1) => (w, (a, w), s1)}) }

我们示范用这个ReaderWriterState来写一段程序:模拟一段通讯端口使用程序并把使用情况记录下来。先传入一个端口号,在程序中可以重设使用的端口号:

1   val program: ReaderWriterState[Config, List[String], Int, Int] = for { 2     _   <- log("Start - r: %s, s: %s") 3     res <- invokeService 4     _   <- log("Between - r: %s, s: %s") 5     _   <- setService(8,"Com8") 6     _   <- invokeService 7     _   <- log("Done - r: %s, s: %s") 8   } yield res      //> program : scalaz.RWS[Exercises.rws.Config,List[String],Int,Int] = scalaz.I 9                    //| ndexedReaderWriterStateT$$anon$5@223191a6

这倒像是一段高级语言写的程序。细节都在几个功能函数里。它们都必须返回ReaderWriterState类型:

 1   case class Config(var port: Int, var portName: String)  2   def log[R, S](msg: String): RWS[R, List[String], S, Unit] =
 3  ReaderWriterState {  4       case (r, s) => (msg.format(r, s) :: Nil, (), s) //.point[Identity]
 5     }                                             //> log: [R, S](msg: String)scalaz.RWS[R,List[String],S,Unit]
 6   def invokeService: ReaderWriterState[Config, List[String], Int, Int] =
 7  ReaderWriterState {  8       case (cfg, invocationCount) => (  9         List("Invoking service with port: " + cfg.portName), 10         scala.util.Random.nextInt(100), 11         invocationCount + 1
12       ) //.point[Identity]
13     }                                             //> invokeService: => scalaz.ReaderWriterState[Exercises.rws.Config,List[String 14                                                   //| ],Int,Int]
15   def setService(p: Int, n: String): ReaderWriterState[Config, List[String], Int, Int] =
16  ReaderWriterState { 17       case (cfg, invocationCount) => cfg.port=p; cfg.portName=n 18         (List("Changing service port to " + cfg.portName), 19           scala.util.Random.nextInt(100), 20  invocationCount) 21     }                                             //> setService: (p: Int, n: String)scalaz.ReaderWriterState[Exercises.rws.Confi 22                                                   //| g,List[String],Int,Int]
23 
24   val program: ReaderWriterState[Config, List[String], Int, Int] = for { 25     _   <- log("Start - r: %s, s: %s") 26     res <- invokeService 27     _   <- log("Between - r: %s, s: %s") 28     _   <- setService(8,"Com8") 29     _   <- invokeService 30     _   <- log("Done - r: %s, s: %s") 31   } yield res                                     //> program : scalaz.RWS[Exercises.rws.Config,List[String],Int,Int] = scalaz.I 32                                                   //| ndexedReaderWriterStateT$$anon$5@223191a6
33 val r =   program run (Config(443,"Com3"), 0)     //> r : scalaz.Id.Id[(List[String], Int, Int)] = (List(Start - r: Config(443,C 34                                                   //| om3), s: 0, Invoking service with port: Com3, Between - r: Config(443,Com3) 35                                                   //| , s: 1, Changing service port to Com8, Invoking service with port: Com8, Do 36                                                   //| ne - r: Config(88,Com8), s: 2),68,2)
37 println(&q
首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Scalaz(17)- Monad:泛函状态.. 下一篇Scalaz(19)- Monad: \/ - Mon..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目