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

【基于 JS 的函数式编程 - 4】子 | MayBe子 | Monad

概念 子 定义: 子是一个普通对象,它实现了map函数,在遍历每个对象值的时候生成一个新对象。即,子是一个实现了 map 契约的对象! 简单理解:子是一个持有值的容器。...Container = function(val) {this.value=val;} let testVal = new Container(3); 这样一来,Container持有了内部的值,我们传入的任何js...Monad是一个含有chain方法的子 你可以通过添加一个chain方法(或者说是join方法)扩展MayBe子,使其成为一个Monad子。...那么,我们就可以知道 Monad 子的一大特点就是能够避免深层嵌套,只要提供下一运算所需要的的函数,就能将函数拆解成互相连接的多个步骤,自动进行下去,并且每次都是只返回一个单层的子。...这个子有一个 flatMap 方法,即降维的能力。

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

    Applicative

    Applicative 定律 Application 子是一种加强的子,在 Haskell 的 Control.Applicative 模块中定义了一个 Applicative 类型类: class...fmap f x applicative 子的用途很明确,就是为了取出第一个子值中的函数,应用到第二个子值的值上,上述定律基本可以保证只是做了这件事,当然其他还有一些定律,就不细说了,列在这里大家看看就好...至于的话,先考虑函数作为普通子的情况,我们知道子值是一个包涵上下文的值,当函数作为子值时,从这个上下文中取值的操作就是将一个参数传递给该函数,然后产生一个值,所以函数作为Functor类型类的实例时是这样的...接收一个函数和一个子值,取出子值中的值传递给函数,然后返回一个子值。...那也同理,它接收两个子值,返回一个子值,当函数作为子值时,要先分别取出 f 中的值(函数)和 g 中的值,分别将一个参数 x 传递给它们,再将 g x 作为参数传递给 f x(由于 Haskell

    74110

    编程(16)-泛状态-Functional State

    初接触泛状态觉着很不习惯。...主要是在使用State数据类型时很难理解其中的原理,特别是泛状态变迁机制(state transition mechanism):怎么状态就起了变化,实在难以跟踪。...RNG简单描述了泛方式的状态变迁及支持状态变迁所需要的数据结构和操作函数款式。    ...再次聚焦一下我们设计State类型的目标:State类型不但可以使我们像设计其它类型一样封装一个较低阶类型元素并且提供一套状态变迁机制,而且状态变迁机制是泛式的,自然隐性的。...泛状态是一种隐形自动的变迁,那么如果我们需要打乱既定流程,手动设定或者临时读取状态时该怎么办呢?

    901100

    编程(17)-泛状态-State In Action

    对OOP编程人员来说,泛状态State是一种全新的数据类型。我们在上节做了些介绍,在这节我们讨论一下State类型的应用:用一个具体的例子来示范如何使用State类型。..._)) => machine.copy(locked = true, candies = nCandy - 1) 8 } 9 } 这个transition函数采用了泛状态维护风格...对比起来,下面的例子就可以说是真正的泛编程风格了。同样针对以上的贩售机模拟逻辑要求,我们将用典型的泛风格来编程。...在以上这个例子里我们采用了泛编程风格:用类型匹配方式进行了函数组合,虽然说代码可能简单了,但清洁可能就说不上了。...需要用类型匹配(type line-up)来分析理解,也就是要再熟悉多点泛编程思考模式。

    77180

    编程(0)-什么是泛编程

    什么是泛编程(Functional Programming)?泛编程就是用函数编写程序。这个回答太抽象,等于没说。...再说清楚一点:泛编程就想砌积木一样把函数当成积木块,把函数的输出输入作为积木的楔子和楔孔,把一个函数的输出当作另一个函数的输入组合成一个更大的函数。整个砌积木的过程就是泛编程。...那么,可不可以说指令编程就对应变量赋值,泛编程相当于函数组合呢?实际上“函数组合”这个词是泛编程的灵魂,英文是Functional Composition。这么说是不是又清楚了一点了?...要知道泛编程是一个全新的编程范畴。     如果泛编程就是组合函数,那这可是一种全新的编程方式。如何实现函数的组合呢?...泛编程是以数学理论(⋋-culculus)为基础的,程序函数的组合是通过数学函数组合定律来实现的。嗯,的确是一套全新的概念,那就让我们从头学起吧。

    1.3K80

    编程(32)-泛IO:IO Monad

    由于泛编程非常重视函数组合(function composition),任何带有副作用(side effect)的函数都无法实现函数组合,所以必须把包含外界影响(effectful)副作用不纯代码...IO Monad就是泛编程处理副作用代码的一种手段。...现在,有了这个IO类型,我们可以放心地用函数组合的泛编程方式围绕着这个IO类型来编写IO程序,因为我们知道通过这个IO类型我们把副作用的产生推延到IO程序之外的IO解译器里,而IO编程与解译器是两个各自独立的程序...泛模式的IO编程就是把IO功能表达和IO副作用产生分开设计:IO功能描述使用基于IO Monad的Monadic编程语言,充分利用函数组合进行。...在泛编程模式里变量是用类型参数代表的: 1 trait IO[+A] { self => 2 def run: A 3 def map[B](f: A => B): IO[B] = 4

    2.5K70

    编程(27)-泛编程模式-Monad Transformer

    同样,泛函数据类型Foldable,Monoid,Functor,Applicative,Traversable,Monad也是我们将来进入实际泛编程的必需。...通过for-comprehension可以实现泛风格的“行令编程模式(imperative programming)。...泛编程与传统的行令编程在模式上最大的分别就是在泛编程中没有变量声明(variable declaration),变量是包嵌在一个结构里的(MyData(data)),得申明这个结构(trait MyData...所以泛编程的命令执行都是在一些结构内部进行的。Monad组件库中的组件主要支持这种结构内部运算风格。...无法使用行令编程模式肯定对泛编程过程造成诸多不便,但Monad使for-comprehension成为可能,而在for-comprehension内可以实现行令编程,所以泛编程被称为Monadic

    1.2K70

    编程(1)-泛编程是如何实现的

    编程就是把函数组合起来形成一个完整的程序。可想而知,函数组合的过程可以是曲折的,形成的程序可以是复杂的。那么泛编程又是如何保证一个复杂的函数组合程序是正确无误的呢?...实际上这也是泛编程的重点所在,我看还是要解释清楚才行。     泛程序是由纯函数组成。所谓纯函数(Pure Function)是指这个函数的结果完全或只依赖它的输入。...因为泛程序是由纯函数组成,纯函数是”可等量替换的“,具备行为不可变化特性,所以能保证泛程序的正确性。    ...在Scala语言中 “+” 是个函数名称,我们可以确定这个“+”函数是个纯函数,因为我们可以放心的用结果2来“等量替代” 表达式1+1。...泛编程要求尽量使用”不可改变的“(Immutable)数据结构来保证程序的纯洁性。泛编程就好像是使用”不可改变的“数据结构过程的挣扎,起码对我来说是这样的。

    1.6K80
    领券