vlambda博客
学习文章列表

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂


上面这位帅小伙叫维特根斯坦,是一名奥地利哲学家,其研究领域主要在语言哲学、心灵哲学和数学哲学等方面。他在逝世前的最后一句话是“告诉他们,我已经有过非常精彩的人生”。而上图的这一句则是他在《逻辑哲学论》中提到的,译为“我的语言的界限意味着我的世界的界限。”,另外一种译法是“语言的界限就是一个人的世界的界限。”。但,不论何种说法,想表达的意思已经很明显了。倘若你眼下没有理解并没有关系,在不同的人生阶段,我们总会形成一些不同的思想,过一段时间再来看看,说不好就有一些新的体会。


在计算机领域,也有许多语言,我们学习该语言,然后用它和计算机沟通,进而让计算机为我们干活。在我们的世界,如果把文言文和白话文看作组织中文的两种方式,那么在计算机的世界,也有一种关于如何组织语言的做法。


是为题记。




我今天想要讲是:函数式编程,又叫函数式程序设计。更确切的说,我想要讲的是:函数式程序设计思维。什么意思呢?就是隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂。如果最后能让你体会到一点点不一样的东西,那么我本次的目的就达成了。


本着“talk is cheap, 放马过来”的理念,这里用“show you the picture”的方式开始一本正经的扯淡。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




我知道,可能会有这样一些声音:程序需要设计吗?又不是不能用!要啥自行车!!这里,我的目的并不是挑起战争,只是觉着,作为有所追求的后浪,是不是能更好一点?再好一点??毕竟当下的生活中,我们不还追求着所谓精致生活。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




那说了这么多,函数式编程究竟是个什么东西?如果你检索过维基百科,它会告诉你是一种编程范式。如果你继续检索,还会了解到它的许多特点,而当你深入这些特点的时候,还会了解到一些东西,这些东西我相信会让你有一种头皮发麻的感觉。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




这里,我不会对这些东西进行展开,如果你有兴趣,可以自行检索研究。简单起见,总结如下。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




那么,在实际的工程项目中它长什么样子?为了便于演示,这里选择lisp家族中的sheme方言。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




为了便于理解后面的编程示例,先来快速的学习一下scheme。以人们熟知的算数表达式为例,有以下两种记法。而scheme作为lisp的一个方言,自然也是选择第二种“前缀表示”的记法。关于scheme的其他一些语法,都在下面了。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




下面进入实战环节,简单起见,这里的问题依旧很简单。作为对比,下面给出了一个Golang语言的解法,在看到这里给出的做法之前,你可以先思考一下自己的解法,这样,当看到最后用scheme基于函数式程序设计的解法时,产生的对比可能会更强烈。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




下面是用scheme语言基于函数式程序设计的思想的解法。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




对于一次性的需求,上面的解法产生的对比,也许还不强烈。但实际的项目中,需求总是会变的,一旦需求产生变化,对于那些非函数式程序设计的解法,此时的做法会是怎样的呢?下面是给出的一些变化,以及基于函数式程序设计的解法,作为对比,你可以先想想自己的解法。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




演示到这里结束。不晓得你看懂了没有,有没有那么一点点特别的体会。下面是我给出的一些总结。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




近些年,中台的概念随着马云的一次国外考察而火了起来。起初我听说中台时,是很懵逼的,因为不晓得是啥,该怎么做,业界也没有一些标准示例参考,基本上都是处于盲人摸象的状态,而且每个人都有自己的一套摸法,至于对不对,就另说了。后来,我在整理上面这些资料的时候,联想到了这个,于是想了一下,便有了下面这样的思考。

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




在正式结束前,这里给出为什么在函数式程序设计里说一切皆函数的一种解释。


函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂

函数式程序设计思维:隐匿在函数式程序设计背后的思维方法,及支撑它的粘合剂




本文综合参考了网上的许多优秀文章,以及书籍。