趣味函数式编程圣经

1

第一天

上帝看到约翰·麦卡锡发明了表处理语言 Lisp,却只用来学术研究,很是伤心,就把 Lisp 解释器的秘密告诉了他的学生斯蒂芬·罗素,斯蒂芬·罗素将eval函数在IBM 704机器上实现后,函数式编程的大门第一次向人类打开了。

2

第二天

这个平行宇宙的上帝思想独特,他说:“ 要有不变量”

上帝又说: “函数应该是纯粹的(纯函数)”

不能修改传递给函数的变量!

不能修改全局变量!

对于同样的输入参数,返回值总是相同的!

下面的函数是被允许的,每次调用,返回值都相同,可以安全地调用,直到宇宙毁灭。

这样的函数在函数式宇宙中是不允许的,因为第二次调用就会导致函数式宇宙的毁灭。

这个函数是不被允许的,它竟然想修改输入参数!

如果函数返回了一个新的数组,而没有改变原有的值,那函数式上帝很高兴。

人类对于上帝立下的规矩表示迷惑不解: are you kiding me ?

3

第三天

人类尝试着写程序,由于不变量的规定,发现连个最基本的for 循环都搞不定。

人类迷惑不解:“有没有搞错, 我们怎么写循环?”

上帝说:“你们用循环干什么?”

人类写了一段代码。

上帝说:要有递归!

上帝也写了一段代码:

人类说:“这虽然能完成工作,但是好像不太直观啊!再说,亲爱的上帝,如果我那个list容量很大,递归层次很深,会不会出现栈溢出?”

上帝说:“没事,我有尾递归,保证不溢出。这种递归的写法,你们慢慢就习惯了。”

4

第四天

上帝发现很多函数大体上都是相同的,只有部分细节不一样,有很多重复代码,太浪费了。

上帝说:“要有高阶函数!”

让函数来生成函数,把公用的部分抽取出来,不共用的部分与共用部分能组合起来。

上帝提供了几个很好用的高阶函数,如map,filter, fold等,让人类快速高效地去操作集合数据。

5

第五天

上帝对自己的工作很满意。仿佛程序世界的框架已经基本完成,只剩下边边角角的实现了。

可是这个宇宙的人类总是抱怨函数式编程太难,看到这里的上帝不愿意改变,有很多人都穿越到编号为S-87那个所谓“面向对象”的宇宙去了。

上帝叹了口气:“你们呐,目光短浅,摩尔定律已经失效,多核时代已经来临,我们函数式编程天生是为并发编程而生的啊,你看看函数没有side effect,不共享变量,可以安全地调度到任何一个CPU core上去运行,没有烦人的加锁问题,多好啊!”

过了两天,隔壁 S-87 宇宙的面向对象上帝来串门了。

面向对象上帝说:“亲爱的函数式上帝,听叛逃者,不,投诚者,啊,是穿越到我那里的人说,你这个宇宙有个叫做函数式编程的宝贝?”

函数式上帝:“还宝贝?!人都跑光了!”

“你给我讲讲吧,到时候我再劝他们回来。”

函数式上帝于是给他讲了自己创世纪时立下的规矩,还讲了很多他打算在第6天,第7天告诉人类的知识,什么Currying, 惰性求值,宏(macro)等等。

面向对象上帝表示感谢,喜滋滋地回去了。

后来,函数式上帝听说面向对象的宇宙出现了不少混合式风格编程的语言 OOP + FP (Functional Programming),也就没多少人再回到自己的宇宙了。

函数式上帝什么都没说,叹了口气。

6

第六天

函数式上帝决定休息。

7

第七天

函数式上帝继续休息。

这就是为什么函数式世界的程序员能休息两天的来历。

以上就是趣味函数式编程圣经 的详细内容,更多关于函数式编程的资料请关注我们其它相关文章!

(0)

相关推荐

  • Scala函数式编程专题--函数思想介绍

    为什么我们需要学习函数式编程?或者说函数式编程有什么优势?这个系列中我会用 scala 给你讲述函数式编程中的优势,以及一些函数式的哲学.不懂 scala 也没关系,scala 和 java 是类似的,在每篇的开头我也会先说明这节中用到的 scala 语法. 为什么函数式编程这几年火起来 如 Python 一样,函数式编程(FP,即Functional Programming)也是近几年才逐渐为人们所知,但它并不是一个多么新的概念.它拥有和面向对象编程(OOP)几乎等长的历史.但纵观每件事的脉络

  • JS中的一些常用的函数式编程术语

    组合 Composition 组合某种类型(含函数)的两个元素,进而生成一个该类型的新元素: JavaScript let compose = (f, g) => a => f(g(a)) let toUpperCase = x => x.toUpperCase() let exclaim = x => x + '!' let shout = compose(exclaim, toUpperCase); shout("hello world") // HELLO

  • JDK都出到14了,你有什么理由不会函数式编程(推荐)

    函数式接口 先看一下官方定义 Functional interfaces provide target types for lambda expressions and method references. 可以看出函数式接口主要用于lambda表达式,这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法),一开始也称SAM类型接口(Single Abstract Method). 简单使用 List<Integer> list = Lists.newArrayList(

  • 深入了解java 8的函数式编程

    前言 关于"Java 8为Java带来了函数式编程"已经有了很多讨论,但这句话的真正意义是什么? 本文将讨论函数式,它对一种语言或编程方式意味着什么.在回答"Java 8的函数式编程怎么样"之前,我们先看看Java的演变,特别是它的类型系统,我们将看到Java 8的新特性,特别是Lambda表达式如何改变Java的风景,并提供函数式编程风格的主要优势. 函数式编程语言是什么? 函数式编程语言的核心是它以处理数据的方式处理代码.这意味着函数应该是第一等级(First-

  • 函数式编程入门实践(一)

    在文章之前,先和大家讲一下对于函数式编程(Functional Programming, aka. FP)的理解(下文我会用FP指代函数式编程): FP需要保证函数都是纯净的,既不依赖外部的状态变量,也不产生副作用.基于此前提下,那么纯函数的组合与调用,在时间顺序上就不会产生依赖,改变多个函数的调用顺序也不必担心产生问题,因此也会消灭许多潜在的bug. 函数必须有输入输出.如果一个函数缺乏输入或输出,那么它其实是一段处理程序procedure而已. 函数尽可能的保持功能的单一,如果一个函数做了多

  • 趣味函数式编程圣经

    1 第一天 上帝看到约翰·麦卡锡发明了表处理语言 Lisp,却只用来学术研究,很是伤心,就把 Lisp 解释器的秘密告诉了他的学生斯蒂芬·罗素,斯蒂芬·罗素将eval函数在IBM 704机器上实现后,函数式编程的大门第一次向人类打开了. 2 第二天 这个平行宇宙的上帝思想独特,他说:" 要有不变量" 上帝又说: "函数应该是纯粹的(纯函数)" 不能修改传递给函数的变量! 不能修改全局变量! 对于同样的输入参数,返回值总是相同的! 下面的函数是被允许的,每次调用,返回

  • 深入理解Scala函数式编程过程

    深入理解Scala函数式编程过程 我们马上开始一段变态的过程 如果要求立方和,可以这么做 35 * 35 * 35 68 * 68 * 68 没毛病,抽象一点儿,写个函数: def cube(n: Int) = n * n * n cube(35) cube(68) 省事儿了,如果求1到10的立方和,OK,写个递归 def cube(n: Int) = n * n * n def sumCube(a: Int, b: Int): Int = if (a > b) 0 else cube(a) +

  • 《JavaScript函数式编程》读后感

    本文章记录本人在学习 函数式 中理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习. 在近期看到了<JavaScript函数式编程>这本书预售的时候就定了下来.主要目的是个人目前还是不理解什么是函数式编程.在自己学习的过程中一直听到身边的人说面向过程编程和面向对象编程,而函数式就非常少.为了自己不要落后于其他同学的脚步,故想以写笔记的方式去分享和记录自己阅读中所汲取的知识. js 和函数式编程 书中用了一句简单的话来回答了什么是函数式编程: 函数式编程通过使用函数来将值转换为抽象单元

  • Python函数式编程

    主要内容 1.函数基本语法及特性 2.参数与局部变 3.返回值 4.递归 5.名函数 6.函数式编程介绍 7.阶函数 8.内置函数 函数基本语法及特性 定义 数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一 个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变 量,y是x的函数.自变量x的取值范围叫做这个函数的定义域. 但编程中的「函数」概念,与数学中的函数是有很 同的 函数是逻辑结构化和过程化的一种编程方法 函数的优点 减少重复代码 使程

  • JavaScript的函数式编程基础指南

    引言 JavaScript是一种强大的,却被误解的编程语言.一些人喜欢说它是一个面向对象的编程语言,或者它是一个函数式编程语言.另外一些人喜欢说,它不是一个面向对象的编程语言,或者它不是一个函数式编程语言.还有人认为它兼具面向对象语言和函数式语言的特点,或者,认为它既不是面向对象的也不是函数式的,好吧,让我们先搁置那些争论. 让我们假设我们共有这样的一个使命:在JavaScript语言所允许的范围内,尽可能多的使用函数式编程的原则来编写程序. 首先,我们需要清理下脑子里那些关于函数式编程的错误观

  • 详解用函数式编程对JavaScript进行断舍离

    我和JavaScript 从1997年网景的Navigator 3浏览器开始就开始使用JavaScript.当时,JavaScript还只能做一些很简单的事情.我记得最酷的就是用JavaScript实现mouseover特性,在那个时候已经算得上是高科技了!当鼠标移过去之后,文本内容就神奇的改变了.因为当时都是pre-DHTML,你根本不需要隐藏或则显示DOM元素. 关于DHTML DHTML是Dynamic HTML的简称,就是动态的html(标准通用标记语言下的一个应用),是相对传统的静态的

  • Java函数式编程(八):字符串及方法引用

    第三章 字符串,比较器和过滤器 JDK引入的一些方法对写出函数式风格的代码很有帮助.JDK库里的一些的类和接口我们已经用得非常熟悉了,比如说String,为了摆脱以前习惯的那种老的风格,我们得主动寻找机会来使用这些新的方法.同样,当我们需要用到只有一个方法的匿名内部类时,我们现在可以用lambda表达式来替换它了,不用再像原来那样写的那么繁琐了. 本章我们会使用lambda表达式和方法引用来遍历字符串,实现Comparator接口,查看目录中的文件,监视文件及目录的变更.上一章中介绍的一些方法还

  • Swift的函数式编程详解

    Swift 相比原先的 Objective-C 最重要的优点之一,就是对函数式编程提供了更好的支持. Swift 提供了更多的语法和一些新特性来增强函数式编程的能力,本文就在这方面进行一些讨论. Swift 概览 对编程语言有了一些经验的程序员,尤其是那些对多种不同类型的编程语言都有经验的开发者, 在学习新的语言的时候更加得心应手.原因在于编程语言本身也是有各种范式的, 把握住这些特点就可以比较容易的上手了. 在入手一门新的语言的时候,一般关注的内容有: 1.原生数据结构 2.运算符 3.分支控

  • JavaScript 函数式编程实践(来自IBM)第1/3页

    函数式编程简介 说到函数式编程,人们的第一印象往往是其学院派,晦涩难懂,大概只有那些蓬头散发,不修边幅,甚至有些神经质的大学教授们才会用的编程方式.这可能在历史上的某个阶段的确如此,但是近来函数式编程已经在实际应用中发挥着巨大作用了,而更有越来越多的语言不断的加入诸如 闭包,匿名函数等的支持,从某种程度上来讲,函数式编程正在逐步"同化"命令式编程. 函数式编程思想的源头可以追溯到 20 世纪 30 年代,数学家阿隆左 . 丘奇在进行一项关于问题的可计算性的研究,也就是后来的 lambd

随机推荐