固执的程序员学习函数式编程的收获 之 二 说说monad

本文讲述了作者在学习函数式编程时对monad的理解过程,从和同事的对话引入,解释了monad的"容器论"和"链条论"。作者探讨了monad在Java中的Optional、JavaScript中的Promise等场景的应用,并指出monad有助于减少副作用,简化代码。最后,作者提醒在非纯函数式编程中使用monad时要注意容器内的不确定性。
摘要由CSDN通过智能技术生成

之前说了函数式编程的收获。比如说函数可以当作变量,然后尽量避免写副作用的程序。
之后可以说遇到了一个超级难理解的东西–monad。

一切要从和小田君的对话说起

当我在写java时,大概是下面的一段代码

List.map( item -> item.getName());
List.flatmap( item -> item.getName()); // ??

然后不知道map与flatmap的区别。于是对于一个懒人程序猿来说,答案当然不是去问谷歌,而是拉来一个同事。
本人: “小田君,flat和flatmap有什么区别?“
小田: “啊,这个是monad啊“
本人: “莫纳多?”
小田: “嗯,monad”
本人: “莫纳多是什么玩意儿?”
小田: “这个和范畴论有关哦”
本人: “那(tmd)的范畴论又是什么啦?”
小田: “范畴论其实我也不是很懂,不过map和flatmap我觉得可以解释清楚。”
本人: “啊,这样啊,能跟我讲讲吗?(那你喵了个咪的提范畴论干嘛?显得你很浮夸吗?)”
之后小田君用了大概近10分钟跟我讲了一遍两者区别,本人基本上就是“啊~“,“噢!“,“哦?“之类的反应。当时觉得自己听明白了,然后过了两天就忘了,现在想起来他大概讲的还是错的!!!
不过,当小田君教我这些知识时,我真的感觉到我好像和他完全不在一个等级上,顿时感觉自己非常的落伍,得赶紧恶补一下知识。
于是我现实谷歌了monad。然后维基百科了一下,看到的是类似于这种东西。
这里写图片描述
反正基本觉得这讲的不是人话。
于是就问了度娘,然后看了一些文章,里头出现了一些感念如”单子”之类的。可能是受面向对象思想的影响过深,和自己的耐心太差,根本无法理解里边的内容。于是想,是不是该学一学函数式语言了。
于是看了一本《functional programming in javascript》。因为js基本还会写,学习成本会比较低。意料之中书里有专门的一章讲monad,不过当我看到monad那一章时,由于经过了一段时间,自己之前通过调查对monad的一些理解基本荡然无存,最终出乎意料地没能理解monad。
于是一怒之下之下打开youtube,开搜monad!然后出现了这个老头的视频。
这里写图片描述
这个叫布莱恩贝克汉姆的老头,不用任何数学专用词汇,很简洁地(至少我看视频时觉得)解释了monad,然后说实话,我没听明白…
于是最终还是决定学一下Haskell,觉得可能用这个语言更容易理解monad。虽说monad这个概念肯定是不依赖于某个语言的。但是语言其实是能帮助理解的,因为你其实是在用语言在思考。
Haskell后发现对布莱恩贝克汉姆的解释容易理解了,不过自己好事处于”这是什么玩意儿,不过反正它好神奇”的状态。
对于自己现在函数式编程的思想还并不像面向对象那样深入骨髓,可能能更好地以”前函数式编程时代”的头脑来说事情。想必很多未接触过函数式编程的人理解monad也会废力一些。尽量不用函数式的专业术语,试着解释一下monad。

什么是monad

网上比较多的说法有两种,名词时自己想的,不是准确的术语。
- 容器论
- 链条论
简单说一下两者的解释

容器论

monad像一个容器,容器里存放着一个值。
从国外的网站盗的图,很形象的说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值