如何学会函数式编程

开发 前端
本文是从 How to get started with functional programming 这篇文章翻译而来。

上周末,有人问我,如何学会函数式编程。我的回答是:用你现在使用的编程语言写纯正函数。

纯函数唯一的输入是它的参数,唯一的输出是它的返回值。如果你以前从未接触过这个概念,你会以为所有的函数都是纯正的。毕竟,所有的函数都是接受一个或多个输入值,返回一个输出值。但在某些传统编程中,经常会有一些外来的信息流入或流出函数。例如,一个不规范的函数有可能会依赖一个全局变量或一些类成员数据。在这种情况下,函数的行为并不完全决定于它的参数值。相似的,一个不规范的函数有可能会更改一个全局变量或修改数据库。这种情况下,函数除了返回值外,还会附带一些额外操作。

你可以用任何语言写出纯函数,只是有些语言容易写,有些语言写起来比较复杂。例如,没有人会把Fortran当作一种函数式语言,但有些人(M. J. D. Powell)却强制自己在Fortran里要写纯函数。

为什么要写纯函数?

纯函数具有亲系透彻性(referential transparency),也就是说,针对相同的输入值,它一定给出相同的输出值。函数输出不依赖系统时间、数据库状态以及任何没有显式的作为参数传入函数的东西。这也表明纯函数易于理解(因此也易于调试和测试)。

你可以一直使用纯函数。

但如果你想把一个值放到数据库里,光通过纯函数是实现不了的。或者当你想调用一个随机数发生器时,你可不想它保持亲系透彻性 —— 每次都返回相同的值。但是,在可以用到纯函数的时候,你应该使用纯函数,用纯函数来消除越界联系。完全的纯函数程序是不现实的;有人建议说***的纯度系数应该是 85%。

那么,为什么程序员不大量的使用纯函数呢?

一个原因是,纯函数需要更长的参数表。在面向对象的编程语言里,对象可以隐式的依赖对象状态来减少参数数量。对于这更简洁的方法接口,你付出的代价是,你无法只通过方法本身来理解这个方法。调用这个方法时你还需要知道对象的状态。为了获得更短的方法接口而放弃亲系透彻性值不值得?这依赖于你的上下文环境和你的风格,按我的观点,我更愿意用更长的函数接口来换取更纯的函数。

另外一个人们不太喜欢使用纯函数的原因是,把大型数据结构传入函数太麻烦。但这也依赖于你怎么干。你可以只是形式上的把一个对象传输给函数,而不是把整个对象按字节拷贝进去。

为了效率,你也可以制造一些假纯度。例如,Mike Swaim最近在一个评论里给出了一个如何利用Memoization让程序的速度提升数个等级的例子。(Memoization是一种缓存技术。当一个函数向系统请求计算某些东西时,它首先看看这个东西是否已经被缓存过。如果是,它会从从缓存里取出结果返回。如果否,它会计算它,然后把输出放到缓存里。)使用Memoization技术的函数严格的说不是纯函数 —— 它的计算操作直接受缓存状态的影响 —— 但这样的函数仍然保持亲系透彻性,如果你给它相同的输入,它总会产生相同的输出。你可以认为称这样的函数为纯函数是一种欺骗,的确也是,但如果你总是纠结于这种事情,那你也知道,完全纯函数是有副作用的。

原文:http://www.aqee.net/how-to-get-started-with-functional-programming/

【编辑推荐】

  1. JavaScript入门之基本函数
  2. 2011下半年Web编程语言和脚本语言的就业趋势
  3. 学习不同编程语言的重要性
  4. 编程巨星成长的唯一秘诀
  5. 每一门编程语言都是上辈子折翼的天使
责任编辑:陈贻新 来源: 外刊IT评论
相关推荐

2018-11-28 11:20:53

Python函数式编程编程语言

2020-09-23 07:50:45

Java函数式编程

2020-09-22 11:00:11

Java技术开发

2021-09-30 11:12:00

函数式编程 Actor

2013-09-09 09:41:34

2013-03-20 10:22:51

编程语言编程开发语言

2023-12-14 15:31:43

函数式编程python编程

2022-09-22 08:19:26

WebFlux函数式编程

2017-06-08 14:25:46

Kotlin函数

2011-03-08 15:47:32

函数式编程

2020-09-24 10:57:12

编程函数式前端

2016-10-31 20:46:22

函数式编程Javascript

2012-08-21 09:20:37

函数式编程函数编程编程

2010-11-25 09:06:37

Web开发函数式编程

2016-08-11 10:34:37

Javascript函数编程

2016-08-11 10:11:07

JavaScript函数编程

2012-09-21 09:21:44

函数式编程函数式语言编程

2010-03-11 10:34:22

Scala

2022-07-07 09:03:36

Python返回函数匿名函数

2019-09-09 11:40:18

编程函数开发
点赞
收藏

51CTO技术栈公众号