大话functional编程语言

今天计算机已经被广泛应用于处理繁杂的商业事务和海量的用户数据。人们也许遗忘了,它最初是被用来帮助进行数值计算,简单说,用来求解数学问题的。

所以说functional编程语言,把计算机编程和数学紧密联系起来,回归到了计算机的本意。

有趣的是,数值计算并不是functional语言的强项。functional编程的主旨是通过数学的逻辑和代数的演算,帮助程序员解析复杂的编程问题。所谓解析,就是把复杂的问题拆解成简单的问题,一一解决,然后再组合拼装起来。

一般常用的编程语言(imperative)往往通过函数调用或者object-oriented方法把复杂问题进行拆分,但是组装起来就不是很容易了。

举例来说:假设“月光宝盒”是个API object。

  • 调用一次:月光宝盒.波罗波罗蜜(至尊宝) = 回到五百年前,遇到紫霞仙子;到了黑风岭,把唐僧送给牛魔王;自己被十三娘所杀

  • 再调用一次:月光宝盒.波罗波罗蜜(至尊宝(转世后))= 回到五百年后,带着唐僧去取经

为什么两次调用同一个函数,得到的结果不一样呢?就是这样的复杂性,使得代码无法被简单的组合起来,和重复使用。

你也许会说,我们刚才忽略了“波罗波罗蜜”的一个隐形参数:时光穿梭的年份。例如:

月光宝盒.波罗波罗蜜(至尊宝,−500)表示回到五百年前。

那么按照数学表达式的基本演算规则:

月光宝盒.波罗波罗蜜(月光宝盒.波罗波罗蜜(至尊宝,−500),+500) == 现在的至尊宝

也就是说,先回到五百年前,再从五百年前回来,应该等于没有发生过时光穿梭。因为:−500 + 500 = 0 (回到现在)

可是电影里的山贼至尊宝时光穿梭来回之后,变成了齐天大圣孙悟空。难道这是上天(不,导演)的安排?

问题出在“月光宝盒.波罗波罗蜜(至尊宝)”的调用过程中产生了side-effects,用通俗的话说,就是历史被改变了。

现在我们再来看看,functional编程语言能否帮我们把这个故事解析清楚呢? 其实也很简单,在functional语言中,我们换个角度,把“波罗波罗蜜”作为一个主线的函数:

  • (至尊宝B,月光宝盒B,世界B) = 波罗波罗蜜(至尊宝A,月光宝盒A,世界A)
  • (至尊宝C,月光宝盒C,世界C) = 波罗波罗蜜(至尊宝B,月光宝盒B,世界B)

每次调用“波罗波罗蜜”,都返回一个“新”的至尊宝、月光宝盒、和世界。 至尊宝A是山贼,至尊宝C是齐天大圣。有了这些表达式,我们还能分清

  • 至尊宝B = 求紫霞仙子要月光宝盒,然后要和白晶晶成亲,却念念不忘紫霞

在世界A里有二当家的、白晶晶,十三娘。世界B里有紫霞仙子、唐僧、八戒、黑山老妖,牛魔王。世界C里有唐僧,二当家,白晶晶,十三娘,菩提老祖。世界A里的二当家,或者白晶晶和世界C里的二当家,或者白晶晶完全没有关系。

"波罗波罗蜜"这样的调用方法看起来繁冗,但是它保证每次调用,只要输入的参数一样,得出的结果一定是一样的。所有被side-effects影响的全都列出来,作为返回变量。这样functional语言的表达式,就和数学表达式一样了。很多强大的数学推理的方法也可以被应用到编程当中来。

此外, “转世轮回”也是故事中被广泛使用的函数,比如:

  • 转世轮回(至尊宝B) = 齐天大圣
  • 转世轮回(至尊宝C’) = 至尊宝A

至尊宝C’是被观音大师收走的前齐天大圣,和后来陪唐僧去取经的至尊宝C,判若两人。

其实大话西游的故事用一句代码来表述:

  • (波罗波罗蜜)2 ⋅ 转世轮回(至尊宝C’) = 至尊宝C

解析完毕,收工#

大话functional编程语言相关推荐

  1. Erlang(起个中文名:易浪)不能错过的盛宴

    评:erlang(起个中文名:易浪),在穿戴设备技术,云技术,大数据,游戏服务器等等高并发分布式必然大有用处,这个语言必火!-传统语言除了java和c,其他的必然会死去,今后一定会出现新的类erlan ...

  2. RabbitMQ入门-环境搭建

    为何用消息队列? 用于业务解耦.分布式事务最终一致性.广播.错峰流控等等. RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现. 参考资料: 消息队列之 RabbitMQ:ht ...

  3. 一位Erlang程序员的自白

    Erlang不能错过的盛宴 (快步进入Erlang的世界) 作者:成立涛 (litaocheng@gmail.com) 作为程序员,我们曾经闻听很多"业界动态","技术革 ...

  4. 一位Erlang程序猿的自白

    Erlang不能错过的盛宴 (快步进入Erlang的世界) 作者:成立涛 (litaocheng@gmail.com) 作为程序猿,我们以前闻听非常多"业界动态","技术 ...

  5. 什么是Scheme?原来还可以这样应用!

    Scheme定义 Scheme 编程语言是一种Lisp方言,诞生于1975年,由 MIT 的 Gerald J. Sussman 和 Guy L. Steele Jr. 完成.它是现代两大Lisp方言 ...

  6. 想必这篇秋招面试贴会帮助你

    文章目录 面试的恋爱史 一:简单介绍 二 :秋招面试之初恋 1 和面试的第一个阶段--认识 2 和面试的第二个阶段--好感期 3 和面试的第三个阶段-- 怀疑 4 和面试的第四个阶段-- 信任 5 和 ...

  7. 一位Erlang程序员的告白

    Erlang不能错过的盛宴 (快步进入 Erlang的世界) 作者:成立涛 (litaocheng@gmail.com ) 作为程序员,我们曾经闻听很多"业界动态","技 ...

  8. 【编程语言】函数式编程 Functional Programming

    函数式编程 1. 引言 "函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论. 它属于"结构化编程 ...

  9. 2019 6月编程语言_今年六月您可以开始学习650项免费的在线编程和计算机科学课程...

    2019 6月编程语言 Seven years ago, universities like MIT and Stanford first opened up free online courses ...

  10. 大话卷积神经网络CNN,小白也能看懂的深度学习算法教程,全程干货建议收藏!...

    来源 | 程序员管小亮 本文创作的主要目的,是对时下最火最流行的深度学习算法的基础知识做一个简介,作者看过许多教程,感觉对小白不是特别友好,尤其是在踩过好多坑之后,于是便有了写这篇文章的想法. 由于文 ...

最新文章

  1. 独家 | 手把手教你用Python创建简单的神经网络(附代码)
  2. 雨棚板弹性法计算简图_造价工程师:钢结构工程量计算注意事项
  3. android 简单的音乐播放器实现播放模式的切换
  4. 解决ORA-15097 Cannot shutdown ASM if OCR is Located in ASM
  5. map、mapPartitions、mapPartitionsWithIndex区别在哪里?
  6. luoguP4551最长异或路径
  7. React开发(175):注意在回调里面重新渲染列表
  8. ARM中的ldr指令与adr、ldr伪指令之间的区别
  9. 【ABAP系列】SAP DOI技术中I_OI_SPREADSHEET接口的使用
  10. PHP报错:Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars
  11. Python基础知识入门(一)
  12. Servlet工作原理解析
  13. LiteOS学习笔记-8LiteOS SDK oc流程之LwM2M
  14. Android文件的读写
  15. pycharm如何正确打包ocr且让打包出来的exe尽量小
  16. 爬虫返回乱码以及解决办法以及锟斤拷、ISO-8859-1转码、#、#x转码、unicode转码,gbk转码,ascii转码
  17. 利用Greenfoot制作简单的小游戏——记忆翻牌游戏(三)
  18. Deep Learning 效率神器推荐
  19. 时势下的HMS和GMS的前世今生——前生篇
  20. 交互设计师的自我修炼

热门文章

  1. 用户需求 ≠ 产品需求,如何做需求分析?
  2. 蜜罐合约-老版本solidity引用类型的一个坑
  3. 使用APICloud AVM多端框架开发app通讯录功能
  4. 七周成为数据分析师教程
  5. 中兴新支点操作系统上如何查找文件
  6. 为什么要学习多种编程语言
  7. 愿你不会像我一样,活成狗一般的生活!
  8. Java枚举类 (详细解析java中的枚举类深入浅出)
  9. 从智能交通案例看物联网成功的关键
  10. JN5169 Bootload 烧录过程和DIY烧录程序(一)