首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scalaz(17)- Monad:泛函状态类型-State Monad

我们是F运算模式壳子内对T进行计算。理论上来讲,函数式程序运行状态也应该是在这个运算模式壳子内,也是F[]内更新。那么我们就应该像函数式运算T值一样,也有一套函数式更新程序状态方法。...曾经提到过Writer还可以被理解成一种特别的状态维护,只是目标锁定在了Log更新。那么真正意义状态类型State Monad又是怎样呢?...其它函数都是用来获取新运算值或新状态,如:eval返回F[A],exec返回F[S2]。值得注意是这个F必须是Functor才行,因为我们必须用map才能在F[]内更新运算值或状态。...State Monad应该需要一套读写、传递状态方法。...这些方法可以MonadState trait里找到:scalaz/MonadState.scala trait MonadState[F[_,_],S] extends Monad[({type f[

1.8K80
您找到你想要的搜索结果了吗?
是的
没有找到

泛函编程(24)-泛函数据类型-Monad, monadic programming

所以sequence行为还是依赖于List实例中flatMap实 现方法    对于Option: sequence[A](lm: List[M[A]]): M[List[A]] >>> sequence...而且我们也实现了State类型map, flatMap这两个函数: 1 case class State[S, A](run: S => (A, S)) { 2 def map[B](f: A...我们可以这样解释StateState[S,_]:实际上State[S,_]是一组不同SState[A],换句话说:State不只有一个Monad实例而是一类Monad实例。...: State[S,B] = flatMap(sa)(f) 4 } 看,Monad类参数里糊弄了类系统后,StateMonad内部沿用了State正常表述,没任何变化。...在这个例子里我们了解了Monad意义: 1、可以使用for-comprehension 2、支持泛函式循序命令执行流程,即:高阶类结构内部执行操作流程。

757100

不可变状态

如果我们程序中定义函数和数学函数一样,不依赖可变状态,也不产生副作用,那么我们就可以很好解决之前提到问题。这也是为什么一些语言语法上就鼓励不可变。...,我们显式 labelTree 调用中传递了状态,并将这个过程泛化到可以处理任意标签情况,我们此时可以发现,状态和状态转变其实是一个非常一般情况,对于这样情况,我们可以构建一个新类型专门用来表示它...而 map 方法本身是可以用 flatMap 和 unit 直接定义出来: class StateT[X, S](val trans: S => (X, S)) { // ......,尽管我们显式类型上表示了状态、尽管状态依然是不可变、尽管我们确实能获得正确结果,但我们并没有去手工管理状态更新,状态 Monad 包裹中传递。...(newRight => Branch(newLeft, newRight))) } 重新再看一下 flatMap 和 map 实现,我们就会发现实际上是 flatMap 在帮助我们管理了状态更新

96720

翻译连载 | 附录 B: 谦虚 Monad-《JavaScript轻量级函数式编程》 |《你不知道JS》姊妹篇

类型 函数式编程中有一个巨大兴趣领域:类型论,本书基本上完全远离了该领域。我不会深入到类型论,坦白说,我没有深入能力,即使干了也吃力不讨好。 但是我要说,Monad 基本上是一个值类型。...所以如果 Monad 实例出现在 Monad 操作中,它就会对 Monad 操作起短路(short-circuiting)作用。 Maybe 这个抽象概念作用是隐式封装了操作和无操作二元性。...,因为,它使用一个条件来决定是选择 Maybe Just(..) 还是 Nothing()。...是柯里化,bob.map(..) 调用传入了 bob 自身级别(41),并且创建了一个被其余方法包装 Monad 实例。... 这个 Monad 中调用 ap(alice) 调用了 alice.map(..),并且传递给来自 Monad 函数。

92560

泛函编程(26)-泛函数据类型-Monad-Applicative Functor Traversal

我们又说所有Monad都是Applicative,因为我们可以用flatMap来实现map2,但不是所有数据类型flatMap都可以用map2实现,所以反之不是所有Applicative都是Monad...Applicative注重于各种类型函数施用,也就是map。包括普通函数施用及高阶类型结构内函数施用,还有多参数函数连续施用。...既然Traversable是那么普遍,为什么不把它抽象出来形成一个特殊类型呢?...State能够很巧妙对高阶数据类型结构内部元素进行函数施用同时又维护了运算状态数据。前面我们已经取得了State Nonad实例。...如果我们游览(traverse)一个集合过程中用State Applicative Functor对集合元素进行操作并且维护状态数据,那么将会实现强大高阶数据类型处理功能。

841100

Cats(1)- 从Free开始,Free cats

scalaz学习过程中,我们了解到所谓函数式编程就是monadic Programming:即用monad这样数据类型来构建程序。...而实际可行monadic programming就是用Free-Monad编程了。因为Free-Monad程序是真正可运行,或者说是可以实现安全运行,因为它可以保证固定堆栈内实现无限运算。...讨论中并没能详尽分析什么情况下S[_]必须是个Functor。...下面我们选择能保证运算安全方法来运算tester:首先我们需要Tester类型Monad和RecursiveTailRecM实例: 1 import cats.Monad 2 implicit...KVStoreState[A]类型S参数为immutable.Map[String, Any],所以我们S转换操作时用immutable map操作函数来构建新map返回,典型pure code

3.5K100

Js-函数式编程 前言什么是函数式编程为什么Js支持FP纯函数柯里化组合 compose范畴学functorMonadApplicative FunctorFunctorMonadApplic

特别是调试过程中,我们可以借助插件,任意达到每一个state状态,能够轻松捕捉到错误是在哪一个节点出现。...return sendRequest(host, fixPath, path) } 总结 科里化和偏函数主要用途是组合中,这一小节主要介绍了他们使用方法和行为。...正如你看到,我们只是简单调用 Task map 函数,就能操作将来值,好像这个值就在那儿似的。...Promise是Monad 需要被认为是Monad需要具备以下三个条件 拥有容器, 即Maybe、IO之类。...可以使用then方法第二个回调或使用特殊.catch方法捕获错误 Applicative Functor 提到了Functor和Monad而不提Applicative Functor就不完整了。

1.7K40

Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

而不同类型Monad实例则会支持不同程序运算行为,如:Option Monad在运算中如果遇到None值则会中途退出;State Monad会确保状态值会伴随着程序运行流程直到终结;List Monad...Monad所提供主要注入方法(injected method)是BindOps和MonadOps里。...MonadOps里提供注入方法如下:scalaz/Syntax/MonadSyntax.scala 1 final class MonadOps[F[_],A] private[syntax](val...再形象一点来说上面的for loop就像F[]壳子,for loop内可以进行申明变量,更新状态等OOP式行令编程。但这些变化(mutability)不会漏出for loop之外。...) 可以看到这个过程中有些环节已经超出了我能力,但杠铃最终状态好像还是合理

736100

Scalaz(34)- Free :算法-Interpretation

Free[S,A]是个代表Monad最简单数据结构,它可以把任何Functor S升格成Monad。...我们同样可以简单把Functor视为一种算法,通过它map函数实现运算。...好了,现在我们看看如何用fold来运算prg:fold需要两个入参数:r:A=>B,一个在运算终止Return状态时运行函数,另一个是s:S[Free[S,A]]=>B,这个函数Suspend状态时运算入参数...Suspend Question状态下,运算f(readLine)产生下一个运算。在这个函数里我们赋予了提示、读取正真的意义,它们都是通过IO操作println,readLine实现。...但这个fold方法每调用一次只运算一个ADT,所以使用了递归算法连续约化Suspend直到Return。递归算法很容易造成堆栈溢出异常,不安全。下一个试试foldMap。

71660

泛函编程(31)-泛函IO:Free Monad-Running free

在上节我们介绍了Free Monad基本情况。可以说Free Monad又是一个以数据结构替换程序堆栈实例。...实际上Free Monad功能绝对不止如此,以heap换stack必须成为Free Monad运算模式,这样我们才可以放心使用Free Monad所产生Monadic编程语言了。...实际上我们是用map来运行next。这样我们就可以得出InteractFunctor实例。...还是那句话:用一个有Functor实例类型就可以产生一个Free Monad。然后我们可以用这个产生Monadfor-comprehension里面编写一个算法。...这正是Free Monad功能精妙之处:我们用Monad for-comprehension来编写一段Monadic program,然后Interpreter中赋予它具体意义:用Interpreter

1.2K100

泛函编程(34)-泛函变量:处理状态转变-ST Monad

所以泛函编程模式中好像是禁止任何状态变化state mutation)。...程序变得复杂影响了代码理解、维护及重复利用。 泛函编程采用是一种处理变量状态变化编程语言。在前面我们已经讨论过State Monad,它可以对状态进行读写。...State Monad运作模式是:S => (A,S),即:传入一个状态S,产生一个新值及新状态。...我们需要实现方法包括: 分配新内存单元(memory cell) 读取内存单元数据 存写内存单元数据 ST是个Monad,我们可以制造一个for-comprehensionMonadic语言来进行泛函变量状态转变...把类参数S嵌入RunnableST类内部apply方法里。这样可以有效防止new RunnableST[STRef[Nothing,Int]]这样语句通过编译。

64860

Scalaz(36)- Free :实践-Free In Action - 实用体验

在上面几期讨论中我们连续介绍了Free Monad。因为FP是纯函数编程,也既是纯函数组合集成,要求把纯代码和副作用代码可以分离开来。...AST既是对程序功能描述,它组成过程也就是Monadic Programming了。另外一个过程中,我们可以按需要去实现各种Interpreter,从而达到实际运算目的。...我认为既然FP也被称为Monadic Programming,那么Free Monad应该是FP里最重要数据结构,它应用模式代表了主流FP,应该有个规范具体使用方式。...本次讨论中我们将会集中对Free Monad应用模式进行示范体验。...就像是for-loop里进行我们熟悉行令编程:逐条指令编写。

87950

Scalaz(43)- 总结 :FP就是实用编程模式

Free Monad出现恰恰解决我心中疑问,更正了我对FP偏见:Free Monad提供了一套Monad 算法内( for-comprehension内)行令编程(imperative programming...)方法,解决了FP复杂语法,使Monadic编程更贴近传统编程模式习惯和思维,程序意图更容易理解。...这时我们遇到了flatMap函数方法糖for-comprehension,它可用让我们一个for-loop里进行我们熟悉行令式编程,就像下面这样: for { x <- getRecNo r...接触多了我们就可以了解Monad主要作用就是把一个算法,无论是一个值或者一个函数升格成Monad,这样我们就可以Monad-for-comprehension里使用它们了。...看看scalaz里一些类型Monad格式吧: case class State (run: S => (A,S)) case class Reader(run: A => B) case class

99470

Monad来得更猛烈些吧_Haskell笔记11

这就是State Monad存在意义,想让状态维护变得更容易,同时不影响其它纯部分 从实现角度看,State Monad是个函数,接受一个状态,返回一个值和新状态 s -> (a,s) -- 即 state...且看随机数示例 随机数与State Monad 就场景而言,随机数需要维护状态(随机数种子),非常适合用State Monad来处理 具体,之前随机数场景,通过给random函数换不同随机数种子来生成随机数...(算上传入mkStdGen 7),因为这个种子是最新状态(其余中间状态都被丢掉了) 是的,Moand又简化了一个状态维护通用场景,State Monad帮我们自动完成了中间状态维护,让一切变得尽可能简洁...五.Monad魅力 Monad能够赋予计算一些额外能力,比如: Writer Monad:能够把函数转换成带日志版本,用来追踪执行过程,或者给数据变换添加额外信息 Reader Monad:能够让一系列函数一个可控共享环境中协同工作...,比如从这个环境中读取参数,读取其它函数结果等等 State Monad:能够自动维护状态,适用于需要维护状态场景,比如生成一系列随机数 Error Monad:提供了一种错误处理机制,能够很方便让运算更安全进行

1.5K40
领券