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

Monad是否有一个标准名称(和库实现)来隐藏构造函数后面的计算?

Monad是一种函数式编程中的概念,它用于处理计算过程中的副作用和状态管理。在不同的编程语言中,Monad可能有不同的名称和库实现来隐藏构造函数后面的计算。

在Haskell编程语言中,Monad是一个标准的概念,并且有一个标准的库实现。Haskell的Monad提供了一种方式来组合计算过程,使得副作用和状态管理更加可控和可组合。在Haskell中,Monad的标准名称是"Monad",并且有一个标准的库实现。

在其他编程语言中,虽然可能没有一个标准的名称来指代Monad,但是很多函数式编程语言和库都提供了类似的概念和实现。例如,在Scala编程语言中,Monad的概念被称为"Monad",并且有一个标准的库实现。在JavaScript中,一些函数式编程库(如Ramda和Lodash)也提供了类似的概念和实现。

总之,虽然Monad可能没有一个统一的标准名称和库实现来隐藏构造函数后面的计算,但在函数式编程中,Monad是一个常见的概念,很多编程语言和库都提供了类似的概念和实现来处理计算过程中的副作用和状态管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

编程语言:类型系统的本质

封装允许隐藏数据方法,而继承则使用额外的数据代码扩展一个类型。 封装出现在多个层次,例如,服务将其API公开为接口,模块导出其接口并隐藏实现细节,类只公开公有成员,等等。...这里的表达式,可以通过eval() 方法,计算得到一个数字,二元表达式两个操作数,加法乘法表达式通过把操作数相加或相乘计算结果。...接口类型: 抽象类接口 我们使用接口指定契约。接口可被扩展组合。 接口或契约:接口(或契约)描述了实现该接口的任何对象都理解的一组消息。消息是方法,包括名称、实参返回类型。接口没有任何状态。...我们使用了一种类似于上面的策略模式的技术:将函数作为实参,在需要的时候进行调用。但是,上面的 use10Widgets() 每次调用都会构造生成一个新的 Widget 实例。...了这些小构造块,我们就可以建立函子单子这样的结构。我们不会深入讨论细节,只是简单说明一下。许多领域(如集合论,甚至类型系统)都可以用范畴论表达。

2.6K31

当我们谈论Monad的时候(二)

标准对Functor的定义如下: class Functor f where fmap :: (a -> b) -> f a -> f b 没有具体定义的fmap就是我们需要实现函数...因此我们还需要再设计一个join函数将结果转化为List Integer。...Haskell中的IO函数都会返回一个IO Monad,而上面的代码中,我们并没有对每一条都使用之前的结果。对于部分IO Monad(如putStrLn返回的),我们直接就抛弃了这些返回值。...不过,这也只解释了为什么如今Haskell的ApplicativeMonad是这种状态。那么,是什么原因使Haskell冒着把标准搞乱的风险也要引入Applicative呢?...而Monad计算流程是可变的,这也意味着它的计算“上下文”。一般的计算场景中都是上下文的,比如IO运算。但是这种没有依赖的计算场景其实也是存在的,比如并发、Parser。

77910

深入理解函数式编程(下)

其实这就是模拟了其他范畴内的““无”的概念,方便我们模拟其他编程范式的空值操作。比如: 图 58 这种情况下我们需要去判断xy是否为空。...实际在函数式编程语言实现中,Maybe确实只是一个类型(称为代数类型),具体的一个具体类型Just或Nothing,就像数字可以分为有理数无理数一样。...图 60 假设我们一个代数类型Either,LeftRight分别表示当数据为错误和数据为正确情况下的逻辑。 图 61 这样,我们就可以使用“函数替代分支了。...举个例子,面向对象里面的继承,我在函数式编程中可以使用组合compose或者高阶函数hoc实现。 尽管在实现上是等价的,但和面向对象的编程范式对比,函数式编程很多优点值得大家去尝试。...语义化 一个个小的函数分别完成一种小的功能,当你需要组合上层能力的时候,基本可以按照函数语义进行快速组合。 惰性计算 被组合的函数只会生成一个更高阶的函数,最后调用时数据才会在函数之间流动。

89630

深入理解函数式编程(下)

其实这就是模拟了其他范畴内的““无”的概念,方便我们模拟其他编程范式的空值操作。比如: 这种情况下我们需要去判断xy是否为空。...**构造可能让我们难以理解。 如果非要理解的话,可以理解Maybe为NothingJust的抽象类,JustNothing构成这个抽象类的两个实现。...实际在函数式编程语言实现中,Maybe确实只是一个类型(称为代数类型),具体的一个具体类型Just或Nothing,就像数字可以分为有理数无理数一样。...假设我们一个代数类型Either,LeftRight分别表示当数据为错误和数据为正确情况下的逻辑。 这样,我们就可以使用“函数替代分支了。...在函数式语言中,我们要构建一个个小的基础函数,并通过一些通用的流程把他们粘合起来。举个例子,面向对象里面的继承,我在函数式编程中可以使用组合compose或者高阶函数hoc实现

44410

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

,不必手动安装 一.Writer Monad 追踪执行过程 在理解递归算法的时候,一个强烈的需求,就是想要记录中间过程。...从Monad实现来看,从左侧取出值a附加信息w,将右侧函数应用到a上,并从结果取出值b附加信息w',结果值为b,附加信息为w `mappend` w',最后用return包装结果返回m类型的值,作为...这就是State Monad的存在意义,想让状态维护变得更容易,同时不影响其它纯的部分 从实现角度看,State Monad是个函数,接受一个状态,返回一个新状态 s -> (a,s) -- 即 state...s -> (a,s)的状态操作函数,再包装成StateT >>=从左侧取出状态操作函数,传入s取出新状态s'计算结果a,然后把右侧的函数应用到计算结果a上,又得到一个monadic value,再通过...这样lambda的类型就是标准的s -> (a,s),最后,塞给StateT,构造出新的monadic value State Monad能让状态维护操作更简洁地表达,那么,这个东西能把状态维护操作简化到什么程度呢

1.5K40

【单子】说白了不过就是【自函子范畴】上的一个【幺半群】而已?请说人话!!

我们即使不能一直写纯纯的纯函数,不过,尽可能把这些副作用操作放在最后去执行(延迟处理、惰性处理),这也是函数式编程书写纯函数原则之一! 而实现这种做法靠的就是 Monad!...,被 Monad 函数包裹住含副作用的函数,根本就和纯函数是一样一样的,因为: 你无法知道一间黑色的房间里面有没有一只黑色的猫; 在编程开发中,尤其是多人协作中,一个数据要经过各种计算、加入各种逻辑...、进行不同线路的变异,最后呈现给消费方; 这个数据的链路越长(多计算)、越多(多分支)、越复杂(多异步),数据的元信息越容易丢失,就像一句话,经过不同人的不同方式转述,会变得初始意义相差甚远; 我们试图将计算...Promise Monad 我们尝试用 JS 模拟最基本的 Monad: class Monad { value = ""; // 构造函数 constructor(value) {...传入的是 Promise.resovle(1) 这个 Promise 对象时,已经做了计算,p.then 失效; 关于 Promise Monad 再引用一个很棒的解释(建议重点阅读): 纯函数不能有副作用

99820

Monad_Haskell笔记10

context的值 (>>=) :: (Monad m) => m a -> (a -> m b) -> m b 如果你一个具有context的值m a,你能如何把他丢进一个只接受普通值a的函数中,并回传一个具有...函数输入context里的值,输出普通值 + context里的值:直接调用 函数输入context里的值,输出普通值 + 普通值:用pure包一下再调 所以,就这个场景(把是否处于context里的函数应用到是否处于...) (>>) :: m a -> m b -> m b定义了默认实现,把函数\_ -> m b通过>>=应用到m a上,用于(链式操作中)忽略前面的计算结果 P.S.链式操作中,把遇到的>>换成>>=...默认会报错,让程序挂掉,具体Monad实例自己的实现,比如Maybe: fail _ = Nothing 忽略错误消息,并返回Nothing。...可以返回一个数组(或者结构体、链表等都行),把多个值组织到一起(放进一个数据结构),打包返回 如果一个函数返回个数组,就不确定他返回了多少个结果,这就是所谓的不确定的环境 从List的Monad实现来看

70850

Scalaz(11)- Monad:你存在的意义

前面提到了scalaz是个函数式编程(FP)工具。它提供了许多新的数据类型、拓展的标准类型及完整的一套typeclass支持scala语言的函数式编程模式。...从另一个角度解释:scalaz typeclass 代表着抽象编程概念。typeclass是通过即兴多态实现针对各种类型值的FP式计算的。...:如果我们把Option[T]视作一个运算的话,那么只要这个运算结果不为None就可以选择连续运算,因为:f: T => Option[U],用文字描述即为给一个T值进行计算产生另一个运算Option...现在Bag由两种状态组成:东西的袋子Bagged空袋子Emptied。...Bag状态:如果是装东西的(Bagged)那么像上面的设计一样直接运算f获取下一个Bag状态,如果是空袋子Emptied的话就不做任何运算直接返回Emptied。

86680

泛函编程(25)-泛函数据类型-Monad-Applicative

任何数据类型只要能实现flatMap+unit这组Monad最基本组件函数就可以变成Monad实例,就可以使用Monad组件像for-comprehension这样特殊的、Monad具备的泛函式数据结构内部的按序计算运行流程...从前面的讨论我们可以注意到很多数据类型Monad实例的组件函数都可以用map2unit实现,如: 1 def sequence[A](lma: List[M[A]]): M[List[...答案是否定的,因为用map2+unit是无法实现flatMap、join及compose的。 因为我们能够用flatMap实现map2,所以Monad就是Applicative。...因为我们可以用flatMap实现map2apply,所以所有Monad都是Applicative。...我们可以任何顺序运行验证函数而且可以确保三个验证函数都会运行。我们从flatMapapply不同的行为模式证明Monad操作和Applicative操作是不尽相同的。

1.4K90

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

所以Monad同时又是ApplicativeFunctor,因为Monad实现了mapap函数一个Monad实例可以调用所有ApplicativeFunctor提供的组件函数。...任何实例只需要实现抽象函数pointbind就可以成为Monad实例,然后就可以使用Monad所有的组件函数了。...这是不是暗示着Monad最终会实现某种编程语言?我们把这些函数的使用方法放在后面的一些讨论去。我们先来分析一下flatMap函数,因为这是个Monad代表函数。...Functor的map提供了普通函数,Applicative通过容器提供了施用函数ap而Monad则是通过直接函数施用方式实现F[A] => F[B]: 直接对输入A进行函数施用并产生一个F[B]结果...Option是scala标准一个类型。

743100

函数式编程在 JS 中开发游戏

在本文中,我将分享一些经验,并告诉你是否值得。 什么是函数式编程? 简而言之,函数式编程(FP)是试图重现数学函数概念的范式,数学概念是域集(有效输入)共域(有效输出)之间的关系。...数学函数的输出始终仅与一个输入相关,因此,只要使用相同的输入计算数学函数,它就会返回相同的输出。这是函数式编程最重要的概念之一,也称为确定性。...Monad函数式中是一种流行的构造,并且很难总结出一个简介的定义,这篇文章对其做了一个很好的解释:https://jrsinclair.com/articles/2016/marvellously-mysterious-javascript-maybe-monad...定义了基本函数模板,仍有许多工作要做。...避免使用实现基本函数对于了解每个的工作方式非常有帮助,最终的包大小几乎仅是所使用的 PixiJS 模块的大小。

2.2K40

学习函数式编程 Monad

Monad 定义 Monad 使用场景 Monad 一句话解释 Monad 定义 根据维基百科的定义,Monad 由以下三个部分组成: 一个类型构造函数(M),可以构建出一元类型 M。...❞ 其实,Promise Monad 很类似,它满足了多条 Monad 规则。 Promise 本身就是一个构造函数。...// ps:但一些特殊的情况不满足该定义,下文中会讲到 看完上面的代码,不禁感觉很惊讶,Promise Monad 也太像了吧,不仅可以实现链式操作,也满足单位元结合律,难道 Promise 就是一个...相信掌握了这些理论知识,肯定会对 Monad 一个更加深入的理解。...文中包含了许多数学定义、函数式编程的理论等知识,大多是参考网络资料自我经验得出的,如果有错误的地方,还望大家多多指点 ? 最后,如果你对此任何想法,欢迎留言评论!

70320

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

但从Free Monad反向回顾scalaz的这些基础类型函数,我好像渐渐地明白了它们在scalaz这个FP工具中存在的意义。...因为flatMap是Monad的运算函数,所以FP式的编程又被称为Monadic Programming,直白来讲就是用Monad编程,或者就是在一个Monad壳子(context)里编程。...它们都是把普通的函数或者运算包嵌在一个结构里然后在实现这个类型的flatMap函数时体现这些运算的具体意义。这些道理在scalaz的源代码里都可以得到证实。...好了,Monad各种功能转换、集合方式,我们可以在for-comprehension里进行熟悉的编程了。那么会不会出现在一个for-loop里出现几百行指令的情况呢?...Free Monad是通过函数结构化,既是把flatMap函数作为一种数据存放在heap内存上,然后通过折叠算法逐个运算,这传统的函数引用方式:即通过堆栈设置运算环境根本不同,Free Monad是用

1K70

来看看几种 Monad来看看几种 Monad

假设我们一个函数 \x -> Just (x+1)。他接受一个数字,把他加 1 再包回 Just。...所以如果是右边一只,左边四只的话,那还撑得住。但如果左边五只,那就会失去平衡。 我们要写个程序仿真整个情况。我们想看看皮尔斯究竟在好几只鸟来来去去是否还能撑住。...但如果先写 pole 再写函数名称会比较清楚,所以我们会想定义一个函数 x -: f = f x 我们能先套用参数然后再写函数名称: ghci> 100 -: (*3) 300 ghci> True...他们仍接受鸟的数量跟旧的的 pole,但他们现在会检查是否太多鸟会造成皮尔斯失去平衡。我们用 guards 检查是否差异超过三的情况。...但他不会检查单子律是否被遵守,所以如果我们要写一个 Monad 的 instance,那最好我们确定他遵守单子律。我们可以不用担心标准函数中的型态是否遵守单子律。

1K20

Scalaz(31)- Free :自由数据结构-算式算法的关注分离

我们可以通过自由数据结构(Free Structure)实现对程序的算式算法分离关注(separation of concern)。...我们看看是否能从中推导出Free Monoid,一个Monoid自由数据结构用来实现Monoidal操作的算式、算法分离关注。...针对任意基本类型A的Monoid定义如下: 1、一个二元函数 append: (A,A)=>A 2、一个A类型的初始值(零值)zero Monoid必须遵循以下定律: 1、append函数的关联性associativity...Monad的所有特性操作函数,那么这个Free就是一个用Functor F产生MonadMonad构造器,一个最简单结构的Monad构造器,即Free Monad: 1 import scalaz.Functor...我们将在下次讨论中着重介绍Free Monad的实际应用方式:ASTInterpreter的实现过程。

59290

iOS如何优雅的处理“回调地狱Callback hell”(二)——使用Swift

那什么时候一个闭包参数会跳出函数的生命期呢? 引用唐巧大神的解释: 在函数实现内,将一个闭包用 dispatch_async 嵌套,这样这个闭包就会在另外一个线程中存在,从而跳出了当前函数的生命期。...单子(Monad)根据定义: 对于任意一个类型构造体F定义了下面两个函数,它就是一个单子Monad: func pure(value:A) ->F func flatMap(x:...F)->(A->F)->F复制代码 还是以Async为例,此时的Async已经了unitflatMap满足定义了,这个时候,就可以说Async已经是一个Monad了。...由于它会将第一个参数的计算结果绑定到第二个参数的输入上面,这个运算符也会被称为“绑定(bind)”运算. 为了方便,那我们就把上面的4个操作都定义成运算符吧。...还是回到上述问题,这里我们用Monad面的运算符解决回调地狱。

2.2K20

Monadic Function_Haskell笔记12

更进一步的,如果要实现自定义Monad,可以先实现return>>=,然后就很容易实现Applicative(令 = ap,pure = return)Functor(令fmap = liftM...,其参数顺序是当前元素累加结果(分别对应上面的xma,ma的初始值是pure []),liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -...> f c能够把一个二元函数应用到两个monadic value(分别是p xma)上,再返回一个monadic value。...标准)答案是这样的: foldM = foldlM foldlM f z0 xs = foldr f' return xs z0 where f' x k z = f z x >...如果只喂给foldr一个参数,要求是个二元函数a -> b -> b,要求第二个参数返回值类型相同,所以应该换个姿势看f': f' :: Monad m => t -> (a -> m b) -> (

90130

不可变的状态

从上面的定义可以大致看出 unit 是一个 Monad构造器,对于 M 类型的 Monad 而言,如果将 unit 应用于一个 T 类型的值,那么它将构造一个 M[T] 类型的值。...但是,共享可变变量的实现中还有一个灵活之处,就是它可以很方便地获取修改状态,例如,在给多棵树打连续的标签的过程中,我们可能需要在两棵树之间隔开一个标签,也就是说我们想在给一棵树打上标签先令标签 +...前面提到了,副作用并不止是修改变量一种,它还包括读写文件、读入用户输入、在控制台打印输出等等,总之,一个函数如果除了接收参数返回结果之外做了任何事情,它都产生了副作用。...封装所有副作用 读写变量这一副作用我们可以用前面构建的 StateT 实现,像输入输出这类操作我们办法封装吗?,而且实际上 StateT 的构建方法没有太本质的区别。...副作用的函数我们将其类型变为 IO,使得它可以像一般的值一样传递组合,这是优点,但我们也要注意到,一旦一个语言强制了这一实现,就会导致副作用标记如同病毒一样传播。

97120

鹅厂原创 | 前端中的函数式编程

让我们回想一下初中数学 我们知道一个函数定义域值域,对于定义域里面的一个值,都会对应值域中唯一确定的一个值。...函数式编程抽象层次更好,代码编写组织要求的门槛相对更高,不过其代码往往更能直接体现问题核心,同时对于并行计算天然的支持。...当然这些共性问题已经被发现了,前端领域很多特性、或者框架支持应用函数式编程。 2.1 函数式语言 很多语言都是支持函数式编程的,当然我们的 JavaScript也支持。...函数式编程中对于monad一整套完善的操作,可以将异步函数同步函数统一起,完美地支持函数的组合。目前已经类似的完成封装,比如RxJS,xstream 等。...幸运的是,前端模板技术的 快速发展满足了这个需求,比如react中使用了 jsx 来作为抽象视图层: 抽象视图层的引入打开了前端函数式编程的大门,正如上面的例子,第二个render就是一个函数,它帮我们隐藏操作

69020
领券