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

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

而作为过渡,我选择了Haskell来代替Java进行说明。本篇文章默认读者已经对Haskell的基本语法有所了解,因此对此类内容我不会再做赘述。...Do-notation Do表记(do-notation)是HaskellMonad操作提供的语法糖。在不使用Do表记情况下,使用Monad的代码是相当混乱的。...但是这段代码的可读性实在有限,>>=之后使用λ函数的语法是相当反直觉的,和一般编程语言中“赋值”的书写方向完全相反。...而没了上下文,这就意味着Applicative失去了根据之前运算结果进行下一步运算的能力。在调用形式看,>>=的左侧是之前的运算结果,而右侧通过λ参数将这个结果引入了进来,以供之后使用。...这里用到了一个技巧,Haskell的Applicative实际是很灵活的,它允许我们在声明时选择或liftA2进行声明。liftA2的作用就是一篇中提到的liftM2。

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

Monad_Haskell笔记10

实际,do表示法不仅能用于I/O场景,还适用于任何Monad语法而言,do表示法要求每一行都必须是一个monadic value,为什么呢?...n,ch) | n <- [1,2], ch <- ['a','b'] ] 实际,List Comprehension和do表示法都只是语法糖,最后都会转换成>>=进行计算 六.Monad laws...同样,Monad也需要遵循一些规则: 单位元(Left identity):return a >>= f ≡ f a 右单位元(Right identity):m >>= return ≡ m 结合律...没错,就是<=< 用Kleisli composition(>=>)来描述Monad laws: 单位元:return >=> f ≡ f 右单位元:f >=> return ≡ f 结合律:(f >...与Applicative 回到最初的场景,我们已经知道了Monad语法能够简化context相关计算,能够把a -> m b应用到m a 既然Monad建立在Applicative的基础之上,那么

70450

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

一旦定义了Monad为一类对象,fmap为针对这种对象的操作,那么定律我们可以很容易证明: 图 54 我们可以通过Monad Just挂载的操作来对数据进行计算,这些运算是限定在了Just的,也就是说你只能得到...图 62 你可以想象为Just增加了一个抽象类实现,这个抽象类为: 图 63 这个抽象类我们称为“应用函子”,它可以保存一个函数作为内部值,并且使用apply方法可以把这个函数作用到另一个Monad...我们使用函数式编程的思想,把多个看似不相关的函数进行组合,得到了业务需要的subscribe函数,但同时,上面的任意一个函数都可以被用于其他功能组合。...你可以结合起来使用。下面是Ramda.js示例: 图片69 而纯函数式语言,有很多: Lisp 代表软件 emacs... Haskell 代表软件 pandoc......Q:你愿意在生产中使用Haskell/Lisp/Clojure等纯函数式语言吗? A:不论是否愿意使用,现在很多语言都开始引入函数式编程语法了。并不是说函数式编程一定是优秀的,但它至少没有那么恐怖。

88530

Zipper_Haskell笔记13

= last xs : (reverse' (init xs)) 反转List就像倒序一叠扑克牌,抽出最下面的一张放到新牌堆最上方,接着抽出倒数第二张放到它下面……所以,对牌堆进行倒序操作的结果实际是造出了一个新牌堆...,不需要再从根开始找 实际,我们希望的是: 不生成中间多余的完整树,在需要的时候(比如一系列修改操作之后)才生成完整树 能够方便地进行局部修改(改左右兄弟、父级子级),而不用关注完整树 要对一棵子树进行多次修改...进行局部修改的同时要保留其结构上下文信息。...zipper-hole Zipper Monad The Zipper Monad is a generic monad for navigating around arbitrary data structures...参考资料 Zipper Control.Zipper Control.Monad.Zipper Haskell error: Couldn’t match type ‘a’ with ‘b’

46350

铁定不纯的IO_Haskell笔记5

写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯的场景(肯定有副作用,或者操作本身就是副作用)如何解决?...,IO与Maybe :: * -> *类似,都是接受一个具体类型参数,返回具体类型(比如IO ()) P.S.其中,newtype与data类型声明类似,语法和用法也都基本相同,newtype是更严格的类型声明...圈定不纯环境类似于async function,I/O Action只能出现在do语句块中,这一点类似于await P.S.实际,执行I/O Action有3种方式: 绑定给main时,作为入口函数...把处理结果写入文件,符合预期 四.System.IO 之前使用的getLine、putStrLn都是System.IO模块里的函数,常用的还有: -- 输出 print :: Show a => a -...); }// test toUpperCase(); 非常形象,getContents,map toUpper等操作都只是造了一系列的Promise,直到遇到putStr需要输出结果才真正去做I/O再进行

1.3K30

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

(函子)和业务输出(链式操作)剥离开来,会让这个“转述”过程更准确、清晰; wiki 中 Monad 没错,一小节中的 Monad 只说了它的应用示例,此小 bar 来看看它在 wiki 中的【超干】...可以直接这样理解:Monad 是一种特殊的数据结构,它能把值进行包装,然后链接执行;王垠在《对函数式语言的误解》中准确了描述了 Monad 本质: Monad 本质是使用类型系统的“重载”(overloading...bind,用于链接执行; Promise 等效于把函数进行包装,Promise.resolve 等效于把这个包装进行拆开,将为一个普通的值; 不过,Promise 不都是 Monad,示例 Promise.resolve...阶段小结 函数式编程中,处处都是惰性思维的体现; Monad 也是惰性计算的实践之一;至于标题中的这句话:【单子】说白了不过就是【自函子范畴】的一个【幺半群】而已?...推荐阅读 函数式语言的宗教 图解 Monad JS 中 Monad 学习函数式编程 Monad monadic.ts 如何解释 Haskell 中的单子(Monad

96920

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

一旦定义了Monad为一类对象,fmap为针对这种对象的操作,那么定律我们可以很容易证明: 我们可以通过Monad Just挂载的操作来对数据进行计算,这些运算是限定在了Just的,也就是说你只能得到...你可以想象为Just增加了一个抽象类实现,这个抽象类为: 这个抽象类我们称为“应用函子”,它可以保存一个函数作为内部值,并且使用apply方法可以把这个函数作用到另一个Monad。...我们使用函数式编程的思想,把多个看似不相关的函数进行组合,得到了业务需要的subscribe函数,但同时,上面的任意一个函数都可以被用于其他功能组合。...关键领域应用 因为函数式编程状态少、代码简洁等特点,使得它在交互复杂、安全性要求高的领域有重要的应用,像Lisp和Haskell就是因一波人工智能热而火起来的,后来也在一些特殊的领域(银行、水利、航空航天等...Q:你愿意在生产中使用Haskell/Lisp/Clojure等纯函数式语言吗? A:不论是否愿意使用,现在很多语言都开始引入函数式编程语法了。并不是说函数式编程一定是优秀的,但它至少没有那么恐怖。

41910

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

写在前面 最早接触过IO Monad,后来又了解了Maybe Monad和List Monad,实际还有很多Monad(比如Writer Monad、Reader Monad、State Monad...有,叫做Difference list,能够进行高效的append操作。...虽然我们也可以用 Haskell 写出这样的程序,但有时候写起来蛮痛苦的。这也是为什么 Haskell 要加进 State Monad 这个特性。...) P.S.注意,Control.Monad.Error和Control.Monad.Trans.Error都已经过时了,建议使用Control.Monad.Except,具体见Control.Monad.Error...Monad的意义在于,从这些常见场景中抽象出通用模式,以简化操作,比如状态维护、日志收集等都能够通过Monad自动完成 单从使用的角度来看,用Monad包一下(没错,就这么简单),就能获得额外的能力,

1.5K40

实现TypeScript运行时类型检查

, TypeScript 的类型基本只存在于编译时.这是众多BUG 的源头, 想以下以下场景:后端的接口定义里将一个字段声明数组, 但实际上有的时候返回null, 前端没有对这个case 进行处理,...的类型一一对应的, 完备程度甚至可以称为TypeScript 的运行时类型检查.io-ts 使用的是组合子(combinator)作为抽象模型, 这与大部分validator generator有本质的区别...尤其是在A和E使用同一种类型进行表示的时候, 会更加难以分辨和处理.对此, 我们将通过tagged union type进行抽象, 类型声明如下:interface Left { readonly...相比于Functor, 拥有更加"强大"的能力:对两个嵌套上下文进行合并, 即Promise> => Promise的转换在Monad的类型声明中, Monad还实现了Applicative...能够对一系列上下文进行串联并且收集其中的值.Monad在Applicative的基础, 能够基于一个上下文中的值, 灵活地创建另外一个包裹在上下文中的值. -- stackoverflow的回答在Promise.all

2.3K30

函数式编程入门教程

上图中,各个点与它们之间的箭头,就构成一个范畴。 箭头表示范畴成员之间的关系,正式的名称叫做"态射"(morphism)。...理论通过函数,就可以从范畴的一个成员,算出其他所有成员。 1.3 范畴与容器 我们可以把"范畴"想象成是一个容器,里面包含两样东西。 ? 下面我们使用代码,定义一个简单的范畴。 ?...右值是正常情况下使用的值,值是右值不存在时使用的默认值。 ? 下面是用法。 ? 上面代码中,如果右值有值,就使用右值,否则使用值。通过这种方式,Either 函子表达了条件运算。...上面代码中,如果用户没有提供地址,Either 函子就会使用值的默认地址。 Either 函子的另一个用途是代替try...catch,使用值表示错误。 ?...有时,我们想让函子B内部的函数,可以使用函子A内部的值进行运算。这时就需要用到 ap 函子。 ap 是 applicative(应用)的缩写。凡是部署了ap方法的函子,就是 ap 函子。 ?

1.1K20

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

他是被 Haskell 用在处理语法错误的情况。我们目前不需要太在意 fail。 我们知道了 Monad typeclass 长什么样子,我们来看一下 Maybe 的 Monad instance。...do 表示法 MonadHaskell 中是十分重要的,所以我们还特别为了操作他设置了特别的语法:do 表示法。...其实 do 并不只是可以用在 IO,他可以用在任何 monad 。他的原则是简单明了,把 monadic value 串成一串。我们这边来细看 do 是如何使用,以及为什么我们十分倚赖他。...实际,list comprehension 不过是一个语法糖。不论是 list comprehension 或是用 do 表示法来表示,他都会转换成用 >>= 来做计算。...基本 guard 的意思就是:如果一个布尔值是 False 那就产生一个失败状态,不然的话就回传一个基本的 ()。这样计算就可以继续进行

98120

Heskell与函数式编程

导语 :这个系列打算分为三部分,由浅入深地介绍所谓的函数式编程 1)Haskell入门 2)Monad介绍 3)函数式编程的思想 Haskell简介 Haskell诞生于1990年,是一门纯函数式编程语言...函数式编程和命令式编程有本质的区别,命令式编程是基于冯诺依曼体系的抽象,通俗点来说就是像电脑运作般思考,而函数式编程更多是数学抽象函数的概念,也就是输入和输出的映射关系。...编写第一个Haskell 编写Haskell之前需要把Haskell Platform下载下来(https://www.haskell.org/platform/),安装后使用ghci就可以进行Haskell...但是我们更加习惯于用编辑器进行编码,下面使用文本编辑器来写一段代码。 ?...Haskell 可以使用 :t 命令来查看数值的类型,下面来看下一些常见的类型。 ?

79170

Scala学习路线

比如: 类型系统 函数式编程 Monad 也许是因为那些书面向的都是初学者,在这些方面都讲得比较简略,点到即止。此时如果看>这本书,基本很难看得下去。...这是不是意味着,我们可以让项目中的一部分代码使用Java实现,另一部分使用Scala? 在理论是可以的,并且在实际中,有的时候我们不得不这样。...比如递归的大量使用,比如函数的组合,比如monad的概念,很多都是我之前从来没有见过的。在学习一门纯函数式语言的过程中,我们会发现以前的编程经验用不上了,经常有种寸步难行、有力无处使的感觉。...我公司有个新项目,我想用Scala,边学边用 很多人低估了Scala的学习难度,甚至刚开始学习时,便打算在公司的新项目使用。...spark 这里要根据项目和兴趣进行选择。

2.3K50
领券