设为首页 加入收藏

TOP

Scalaz(18)- Monad: ReaderWriterState-可以是一种简单的编程语言(三)
2017-10-10 12:13:28 】 浏览:4931
Tags:Scalaz Monad ReaderWriterState- 可以 简单 编程语言
](f: R => A) //传入R,返回A后不理会R case class Writer[W, A](w: (W, A)) //直接返回W,A case class State[S, A](f: S => (A, S)) //传入S, 返回A和S

那么把以上三个结合起来后它的款式应该是这样的了吧:

case class ReaderWriterState[R, W, S, A]( run: (R, S) => (W, A, S)  //传入R,S 返回W,A,S
) case class ReaderWriterStateT[F[_],R, W, S, A]( run: (R, S) => F[(W, A, S)]  //传入R,S 返回W,A,S。只是包在了F内
) 

传入的和返回的类型是匹配的。在scalaz里是这样定义的:scalaz/ReaderWriterStateT.scala

/** A monad transformer stack yielding `(R, S1) => F[(W, A, S2)]`. */
sealed abstract class IndexedReaderWriterStateT[F[_], -R, W, -S1, S2, A] { self => def run(r: R, s: S1): F[(W, A, S2)] /** Discards the writer component. */ def state(r: R)(implicit F: Functor[F]): IndexedStateT[F, S1, S2, A] = IndexedStateT((s: S1) => F.map(run(r, s)) { case (w, a, s1) => (s1, a) }) /** Calls `run` using `Monoid[S].zero` as the initial state */ def runZero[S <: S1](r: R)(implicit S: Monoid[S]): F[(W, A, S2)] = run(r, S.zero) /** Run, discard the final state, and return the final value in the context of `F` */ def eva l(r: R, s: S1)(implicit F: Functor[F]): F[(W, A)] = F.map(run(r,s)) { case (w,a,s2) => (w,a) } /** Calls `eva l` using `Monoid[S].zero` as the initial state */ def eva lZero[S <: S1](r:R)(implicit F: Functor[F], S: Monoid[S]): F[(W,A)] = eva l(r,S.zero) /** Run, discard the final value, and return the final state in the context of `F` */ def exec(r: R, s: S1)(implicit F: Functor[F]): F[(W,S2)] = F.map(run(r,s)){case (w,a,s2) => (w,s2)} /** Calls `exec` using `Monoid[S].zero` as the initial state */ def execZero[S <: S1](r:R)(implicit F: Functor[F], S: Monoid[S]): F[(W,S2)] = exec(r,S.zero) ...

我们看到IndexedReaderWriterStateT已经实现了很多IndexedStateT的运算方法如:eva l,exec等。看看它的map和flatMap是怎么实现的:

 

def map[B](f: A => B)(implicit F: Functor[F]): IndexedStateT[F, S1, S2, B] = IndexedStateT(s => F.map(apply(s)) { case (s1, a) => (s1, f(a)) }) def flatMap[S3, B](f: A => IndexedStateT[F, S2, S3, B])(implicit F: Bind[F]): IndexedStateT[F, S1, S3, B] = IndexedStateT(s => F.bind(apply(s)) { case (s1, a) => f(a)(s1) })

 

与我们前面所做的OptionState例子一样:如果F能实现map和flatMap则IndexedReaderWriterStateT就能实现map和flatMap。为了省却在for-loop里每行命令都使用lift进行类型升格,IndexedReaderWriterStateT重新实现了大部分操作函数:

private trait ReaderWriterStateTMonad[F[_], R, W, S] extends MonadReader[({type λ[r, α]=ReaderWriterStateT[F, r, W, S, α]})#λ, R] with MonadState[({type f[s, α] = ReaderWriterStateT[F, R, W, s, α]})#f, S] with MonadListen[({type f[w, α] = ReaderWriterStateT[F, R, w, S, α]})#f, W] with IndexedReaderWriterStateTFunctor[F, R, W, S, S] { implicit def F: Monad[F] implicit def W: Monoid[W] def bind[A, B](fa: ReaderWriterStateT[F, R, W, S, A])(f: A => ReaderWriterStateT[F, R, W, S, B]): ReaderWriterStateT[F, R, W, S, B] = fa flatMap f def point[A](a: => A): ReaderWriterStateT[F, R, W, S, A] = ReaderWriterStateT((_, s) => F.point((W.zero, a, s))) def ask: ReaderWriterStateT[F, R, W, S, R] = ReaderWriterStateT((r, s) => F.point((W.zero, r, s))) def local[A](f: R => R)(fa: ReaderWriterStateT[F, R, W, S, A]): ReaderWriterStateT[F, R, W, S, A] = ReaderWriterStateT((r, s) => fa.run(f(r), s)) override def scope[A](k: R)(fa: ReaderWriterStateT[F, R, W, S, A]): ReaderWriterStateT[F, R, W, S, A] = ReaderWriterStateT((_, s) => fa.run(k, s)) override def asks[A](f: R => A): ReaderWriterStateT[F, R, W, S, A] = ReaderWriterStateT((r, s) => F.point((W.zero, f(r), s))) def init
首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Scalaz(17)- Monad:泛函状态.. 下一篇Scalaz(19)- Monad: \/ - Mon..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目