1.1 什么是函数式编程?

想给函数式编程下个明确的定义,是困难的。因为,存在不同的函数语言,但是,并没有明确的、每种函数语言必须具有的特征集。尽管如此,函数语言仍有一些共同的属性,只是表达解决编程问题的风格稍微有点不同。最容易地描述函数式编程,就是把它与最常见的编程风格:命令式编程(imperative programming),进行比较。

[函数语言]

函数式编程的编程风格是强调表达式计算,而不是执行命令。函数语言中的表达式是用函数组合成基本的值。[Hutton ed. 2002]

这一定义来自学术的邮件列表关于函数语言的常见问题解答(FAQ),所以它可能听起来有点抽象。相信我们,含义会很快变得清淅。第一句“表达式计算”是函数式表示,与命令式代码中的“执行命令”风格相对。命令式语言中的命令被称为语句(statements),因此,我们就用这个名词。让我们看看两者的详细内容:

■语句的执行:程序用一组命令,也称为语句表示。命令通过创建对象并操纵对象,实现最终结果。使用这种方法,通常使用可改变的对象,代码描述了需要执行什么操作才能达到所期望的结果。例如,我们首先制作一杯黑咖啡,这个对象是可改变的,因此,我们可以通过加两包糖以获得所需的结果。

■表达式计算:在函数式风格中,程序代码是描述对象属性的表达式,这个对象就是所需要的结果,不必要指定构造对象所需的步骤,在创建对象之前,是不可能意外使用的。例如,假设我们想要一杯加了两包糖的咖啡,在加糖之前我们是不能喝的,因为当我们得到这个杯子时,它已经包含了[唐军1] 1。

[

1 制作咖啡的类比, LucaBolognese 也曾经在 2009 年的 TechEd 有关 F# 的著名谈话中用过[Bolognese,2009]。这一巧合表明,通过学习函数式编程,你将学会以不同的方式思考,既包括编程问题,也包括下午休息。

]

这听起来差别可能很细微,但它会导致设计的代码方式的巨大变化。唯一的公理是我们写的代码是表达式,而不是语句序列,但这种方法有很多逻辑的后果。封装、组合代码的方式不同了,可以用多种技术写可重用的代码,使用更适合表示复杂计算结果的数据结构……清单可以一直写下去。

定义函数式编程是一回事,更需要理解的是如何把这些概念结合在一起,这两个主题构成本书的重点。你读完本书以后,不仅能理解前面的定义,而且对函数式编程的更直接。这才是更为重要的,遗憾的是,不是几句话就说得清的。

到目前为止,所有这一切听起来都很抽象,但这本书的标题包含的“实用(Real World)”是有充分理由的。函数式编程可以提供显著的好处。当遇到下面的情况,就可以用函数方式来解决(就像这本书的作者一样):

■你发现了吗,很难预测修改代码的后果,是由于隐蔽的依赖关系和微妙之处?

■你发现了吗,自己反复写相同的模式,没少有时间用于处理问题中真正不同和有意义的部分?

■你发现了吗,很难理清代码,担心代码是否每条语句都以正确的顺序,并在正确的条件下执行?

■你发现了吗,很难表达抽象的东西,它隐藏了代码是如何执行的,只指出了你想要实现什么?

■你发现了吗,异步控制流导致代码走向类似于意大利面条,令人抓狂?

■  你发现了吗,很难把任务拆分成逻辑上独立的部分,能够同时运行多个处理器内核上?

■实际的代码行为与在单元测试中是否不同?

在我们正式了解函数式编程如何提高生产力之前,先简单地回顾一下其历史,那是相当的丰富。


[唐军1]

1.1 什么是函数式编程?

时间: 2024-11-03 22:33:53

1.1 什么是函数式编程?的相关文章

Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() 获取文件编码,f.encoding() 获取文件在内存中的编号,f.fileno() 获取文件终端类型(tty.打印机等),f.isatty() 获取文件名,f.name() 判断文件句柄是否可移动(tty等不可移动),f.seekable() 判断文件是否可读,f.readable() 判断文件是

PYTHON修饰器的函数式编程

转自:http://coolshell.cn/articles/11265.html Python修饰器的函数式编程 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能

函数式编程

函数式编程 函数式编程的三大特性: immutable data 不可变数据 first class functions 尾递归优化 函数式编程的准则:不依赖于外部的数据,而且也不改变外部数据的值,而是返回一个新的值给你. 如何变得functional: 1. 没有共享变量 2.通过参数和返回值传递数据 3. 函数里没有临时变量 对现有的代码进行重构(refactoring) 使得代码具有functional programming的优点 lambda a, x: x(a) lambda函数可以

Python学习:映射函数(map)和函数式编程工具(filter和reduce)

在序列中映射函数map map函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表. 例1: def sum(x):     return x + 10 L1 = [1,2,3,4,5,6,7] L = map(sum, L1) #结果为[11, 12, 13, 14, 15, 16, 17] map还有更高级的使用方法,例如提供了序列作为参数,它能够并行返回分别以每个序列中的元素作为函数对应参数得到的结果的列表.如例2所示. 例2: def sum(

javaScript函数式编程-包含闭包、链式优化及柯里化

本文着重介绍个人理解的函数式编程. 函数式编程个人理解为:以函数为主要载体的编程方式. 好处: 语义更加清晰 可复用性高 可维护性好 作用域局限.副作用少 基本函数式编程: //实现数组中每个单词首字母大写 //一般写法 const arr = ['apple','orange','pear']; for(const i in arr) { const c = arr[i][0]; arr[i] = c.toUpperCase() + arr[i].slice(1); //slice()从已有的

javascript - Underscore 与 函数式编程

<Javascript函数式编程 PDF> # csdn下载地址http://download.csdn.net/detail/tssxm/9713727 Underscore # githubhttps://github.com/jashkenas/underscore # 中文官方网站http://www.css88.com/doc/underscore/ # CDN<script src="https://cdn.bootcss.com/underscore.js/1.8

LUA 函数式编程demo

什么是函数式编程 http://www.zhihu.com/topic/19585411/hot 函数式编程的本质函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射.也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态.比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的.在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.

[Java] 函数式编程相关概念 - 笔记1

Java 8 引入了 lambda 表达式,以及函数式编程风格.在了解函数式编程过程中,做了些笔记,摘录于本文. 嵌套函数( Nested Function ) 1. 嵌套函数,是指在另一个函数里面定义的一个函数.外层的函数,这里简称为外层函数. 2. 函数的嵌套可以是多层嵌套.嵌套函数可以看到其全部的外层函数的非局部变量.在实际程序中,嵌套的层数一般很少.下面是一个三层嵌套的例子, innerOfInner 也可以访问在 outer 函数体重定义的变量 x . function outer()

python_way.day7 模块(configparser,xml,shutil,subprocess)、面向对象(上)(创建类,类的构成,函数式编程与面向对象编程的选择,类的继承)

python_way.day7 1.模块 configparser,xml,shutil,subprocess 2.面向对象(上) 创建类,类的构成,函数式编程与面向对象编程的选择,类的继承 1.模块 configparser 用于处理特定格式的文件,其本职上使用open来操作,只能是  [test1] 特定的格式 [test1] k1 = 123 k2 = True [test2] k1 = 123 k2 = v1 文件内容 1.获取 import configparser #打开文件找到文件

为什么函数式编程在Java中很危险?

摘要:函数式编程这个不温不火的语言由来已久.有人说,这一年它会很火,尽管它很难,这也正是你需要学习的理由.那么,为什么函数式编程在Java中很危险呢?也许这个疑问普遍存在于很多程序员的脑中,作者Elliotte对此发表了一些见解,我们一起来看看他是怎么说的. 在我的日常工作中,我身边的开发者大多是毕业于CS编程顶级院校比如MIT.CMU以及Chicago,他们初次涉及的语言是Haskell.Scheme及Lisp.他们认为函数式编程是一种自然的.直观的.美丽的且高效的编程样式.但奇怪的是,我和我