当前位置:首页 > 科技  > 软件

一文看懂:函数式编程为何这么火?

来源: 责编: 时间:2023-12-26 09:30:31 581观看
导读近几年函数式编程变得越来越流行,很多开发语言中都增加了很多函数式编程的能力。比如在JavaScript中使用map函数将数组中的每个元素乘以2:const numbers = [1, 2, 3, 4, 5, 6];const doubled = numbers.map(num => num


khb28资讯网——每日最新资讯28at.com

近几年函数式编程变得越来越流行,很多开发语言中都增加了很多函数式编程的能力。khb28资讯网——每日最新资讯28at.com

比如在JavaScript中使用map函数将数组中的每个元素乘以2:khb28资讯网——每日最新资讯28at.com

const numbers = [1, 2, 3, 4, 5, 6];const doubled = numbers.map(num => num * 2);console.log(doubled); // 输出: [2, 4, 6, 8, 10, 12]

可以看到,这样编写的代码更紧凑、可读性更强。khb28资讯网——每日最新资讯28at.com

当然函数式编程还有很多好处,本文就带大家来探索下函数式编程的概念和实际应用。khb28资讯网——每日最新资讯28at.com

1. 什么是函数式编程?

1.1 概念介绍

函数式编程(Functional Programming,简称FP)是一种编程范式,就像你在拼图游戏中只能用特定的块来构建画面,FP要求我们用函数来构建程序的逻辑。这种范式强调将计算过程分解为可复用函数的集合。khb28资讯网——每日最新资讯28at.com

函数式编程的理论基础是λ演算(lambda),由数学家阿隆佐·邱奇在20世纪30年代引入,这是一套用于研究函数如何定义、如何计算以及如何递归的数学系统。想象一下,λ演算就像是乐高积木的基础板,在这个基础板上,你可以构建任何形式的数据结构和函数,就像你可以用乐高积木构建任何形状的模型一样。khb28资讯网——每日最新资讯28at.com

图片图片khb28资讯网——每日最新资讯28at.com

在函数式编程中,函数定义了输入数据与输出数据之间的关系。这可以用我们的初中数学知识来理解:y=f(x) ,它就是函数的最一般定义。khb28资讯网——每日最新资讯28at.com

函数式编程可以用厨房烹饪来比喻。烹饪中,每道菜的制作都需要一系列步骤,而这些步骤可以被视为一连串的函数。每个函数都是一个烹饪动作,比如切菜、炒菜、煮菜。它们接收原料(输入数据),然后通过一系列处理(函数操作),最终出品一道菜(输出结果)。khb28资讯网——每日最新资讯28at.com

1.2 函数式编程的精髓

函数式编程的核心理念是描述“做什么”(what to do),而不是“怎么做”(how to do it)。这提供了一个更高的抽象层次,让问题描述得更清晰。khb28资讯网——每日最新资讯28at.com

举个例子,给你一个装有苹果的篮子,如果我说“挑出所有红苹果”,这就是描述“做什么”,而不是告诉你具体的挑选步骤。khb28资讯网——每日最新资讯28at.com

再举个代码的例子,计算列表中所有数字的和,使用Haskell编写:khb28资讯网——每日最新资讯28at.com

sumNumbers = sum [1, 2, 3, 4, 5]

这里,sum是一个函数,它知道如何取一个数字列表并计算它们的和。你不需要告诉它如何去做这件事情(如初始化累加器,循环等等),你只需要告诉它你想要做的事情(计算这个列表的和)。khb28资讯网——每日最新资讯28at.com

2. 函数式编程的特点2.1 Stateless:无状态函数

函数式编程中的函数不保留任何状态,函数没有副作用,它们只是接受输入并返回输出,而不改变任何外部状态。khb28资讯网——每日最新资讯28at.com

就像一个好的咖啡机,每次用相同的咖啡豆都能得到一杯品质一致的咖啡。khb28资讯网——每日最新资讯28at.com

这种无状态的特性使得函数式编程成为一种非常适合进行并行计算和分布式计算的编程范式。khb28资讯网——每日最新资讯28at.com

2.2 Immutable:不可变数据

在函数式编程中,输入的数据是不可变的。这意味着函数不会改变输入的数据,而是生成新的数据集作为输出。khb28资讯网——每日最新资讯28at.com

这就像在写字时用铅笔和橡皮擦,函数式编程只允许你用铅笔写在新的纸上,而不是在原来的纸上擦掉重写。khb28资讯网——每日最新资讯28at.com

3.函数式编程的优势和劣势

3.1 优势

代码简洁

函数式编程大量使用函数,减少了代码的重复,因此程序比较短。khb28资讯网——每日最新资讯28at.com

并行执行

由于函数不保持状态,它们可以安全地并行执行,就像多个人同时解不同的拼图一样,彼此之间不会产生干扰。khb28资讯网——每日最新资讯28at.com

无执行顺序问题

函数的执行不依赖于程序的状态,因此不需要担心执行顺序的问题。khb28资讯网——每日最新资讯28at.com

代码重用性

函数式编程鼓励代码的重用,复制粘贴函数不会引起副作用,就像使用模块化的积木一样,可以在不同的作品中重复使用。khb28资讯网——每日最新资讯28at.com

延迟执行

函数式编程允许延迟执行,只有在真正需要结果时,才会计算函数的值。khb28资讯网——每日最新资讯28at.com

确定性

给定相同的输入,函数总是产生相同的输出,这提供了程序的可预测性。khb28资讯网——每日最新资讯28at.com

3.2 劣势

内存占用大

由于不改变原始数据,可能会导致数据被频繁地复制,这会增加内存的使用,还可能需要更多次的读取和写入操作。khb28资讯网——每日最新资讯28at.com

学习曲线陡峭

对于习惯了命令式编程的开发者来说,函数式编程的概念可能需要时间来适应。概念如纯函数、不可变性、递归、高阶函数等可能初学者难以理解。khb28资讯网——每日最新资讯28at.com

4. 函数式编程相关技术4.1 First-class function: 头等函数

在函数式编程中,函数可以作为参数传递,可以作为返回值,也可以赋给变量。这就像在一个游乐园里,所有游乐设施都是“一等公民”,你可以随意搭配使用。khb28资讯网——每日最新资讯28at.com

4.2 Tail recursion optimization: 尾递归优化

尾递归是一种特殊的递归形式,它允许编译器优化递归调用,避免占用过多的栈空间,使得递归的效率接近循环。khb28资讯网——每日最新资讯28at.com

4.3 Map & Reduce: 映射与归约

Map和Reduce是处理集合的两个强大工具,它们让代码更加简洁和易读。Map用于转换数据,Reduce用于合并数据。khb28资讯网——每日最新资讯28at.com

4.4 Pipeline: 管道

管道是一种将多个函数组合起来的方法,数据通过管道流过,依次被这些函数处理。下面是一个管道的例子,在这个例子中,我们首先将number变量值翻倍(double),然后将结果增加1(increment),最后对结果进行平方(square)。khb28资讯网——每日最新资讯28at.com

from functools import reduce# 定义一系列纯函数def double(x):    return x * 2def increment(x):    return x + 1def square(x):    return x * x# 创建一个函数列表,表示要应用的操作顺序functions = [double, increment, square]# 初始值number = 3# 使用reduce创建一个管道,将函数应用于初始值result = reduce(lambda acc, func: func(acc), functions, number)print(result)  # 输出

4.5 Recursing: 递归

递归是一种强大的编程技术,它让我们可以用简洁的方式描述复杂的问题,正符合函数式编程的精髓。khb28资讯网——每日最新资讯28at.com

4.6 Currying: 柯里化

柯里化是将接受多个参数的函数转换成一系列使用一个参数的函数的技术。柯里化可以使代码更加模块化,每个函数的功能更加单一,这有助于提高代码的可读性和可维护性。同时,柯里化也可以使代码更加灵活,因为我们可以通过组合不同的函数来实现不同的功能。举个例子:khb28资讯网——每日最新资讯28at.com

def add(a, b):    return a + bdef curry_add(a):    def add_b(b):        return add(a, b)    return add_b# 使用柯里化的add函数add_5 = curry_add(5)  # 创建一个新的函数,这个函数会将其参数加5print(add_5(10))  # 输出: 15

当我们调用curry_add(5)时,我们得到了一个新的函数add_5,它固定了第一个参数为5,并等待第二个参数。当我们随后调用add_5(10)时,它实际上调用的是add(5, 10)。khb28资讯网——每日最新资讯28at.com

4.7 Higher-order function: 高阶函数

高阶函数可以接受其他函数作为参数或者将函数作为返回值。这类似于你有一个能装其他小盒子的大盒子,这个大盒子可以用来组织和管理那些小盒子。khb28资讯网——每日最新资讯28at.com

举个Python中的例子,reduce就是一个高阶函数,在这里它的第一个参数是匿名函数。khb28资讯网——每日最新资讯28at.com

from functools import reduce    def sum_numbers(numbers):      return reduce(lambda x, y: x + y, numbers, 0)

5. 函数式编程语言

很多语言都提供了函数式编程的支持,不过支持的程度不太一样,这里做个简单的总结。khb28资讯网——每日最新资讯28at.com

Haskell: 完全纯函数式编程语言khb28资讯网——每日最新资讯28at.com

Haskell是一个标准的纯函数式编程语言,所有的操作都是通过函数来完成的,就像在一个世界里,所有的建筑都是用同一种类型的积木搭建的。khb28资讯网——每日最新资讯28at.com

F#, Ocaml, Clojure, Scala: 容易写纯函数的语言khb28资讯网——每日最新资讯28at.com

这些语言设计时考虑到了函数式编程的特性,使得编写纯函数变得容易。khb28资讯网——每日最新资讯28at.com

C#, Java, JavaScript: 需要花点精力写纯函数的语言khb28资讯网——每日最新资讯28at.com

虽然这些语言不是纯函数式编程语言,但它们提供了支持函数式编程的特性,只是需要程序员更加注意避免副作用。khb28资讯网——每日最新资讯28at.com

大部分语言都支持的函数式编程三套件:Map、Reduce、Filterkhb28资讯网——每日最新资讯28at.com

这三个函数是函数式编程中处理数据集合的基本工具,就像在厨房里的刀、叉、勺是处理食物的基础一样。khb28资讯网——每日最新资讯28at.com

6. 装饰器模式

这里之所以提到装饰器模式,是因为它和函数式编程有很多共同点。函数式编程和装饰器模式都关注于函数的灵活性、可复用性和不修改现有代码的原则。khb28资讯网——每日最新资讯28at.com

装饰器模式可以向现有功能添加新功能,而不改变其结构。这就像给一个手机装上手机壳,增加了新的功能(比如防摔),但手机本身并没有改变。khb28资讯网——每日最新资讯28at.com

图片图片khb28资讯网——每日最新资讯28at.com

装饰器的本质就是函数,它也遵循函数式编程的一些原则。下边我们提供两个例子。khb28资讯网——每日最新资讯28at.com

6.1 Python中的装饰器

在Python中,装饰器模式通常使用装饰器函数来实现。装饰器函数是一个接受函数作为参数,并返回一个新的函数的函数。通过装饰器函数,我们可以动态地给一个函数添加一些新的功能,比如日志记录、性能测试、事务处理等。khb28资讯网——每日最新资讯28at.com

下面是一个简单的示例,演示了如何使用装饰器函数来给一个函数添加日志记录功能:khb28资讯网——每日最新资讯28at.com

def log(func):      def wrapper(*args, **kwargs):          print("Calling function:", func.__name__)          result = func(*args, **kwargs)          print("Function returned:", result)          return result      return wrapper    @log  def add(x, y):      return x + y

当我们使用@log注解add时,我们实际上是将add传递给了log,并且使用log返回的wrapper函数来替代原始的add。khb28资讯网——每日最新资讯28at.com

6.2 Golang的装饰器

在Go语言中,装饰器模式没有语法糖像Python的装饰器那样直观。在Go中,你需要手动将一个函数传递给另一个函数,从而实现装饰。下面还是记录日志的例子:khb28资讯网——每日最新资讯28at.com

package main  import "fmt"  // 原始函数  func add(x, y int) int {      return x + y  }  // 装饰器函数  func logDecorator(f func(int, int) int) func(int, int) int {      return func(x, y int) int {          fmt.Printf("Calling function: add/n")          result := f(x, y)          fmt.Printf("Function returned: %d/n", result)          return result      }  }  func main() {      // 使用装饰器函数包装原始函数      decoratedAdd := logDecorator(add)      // 调用装饰后的函数      fmt.Println(decoratedAdd(2, 3))  }

7. 函数式编程在实际中的应用

大数据处理:在大数据领域,函数式编程的概念,特别是Map和Reduce,被广泛应用于数据的处理。想象一下,你有一座由许多小石头组成的山,Map就是用来挑选出你需要的石头,而Reduce则帮你把这些石头粘合成一座小山丘。khb28资讯网——每日最新资讯28at.com

响应式编程:响应式编程(Reactive Programming)是一种与函数式编程有着密切关系的编程范式,它侧重于数据流和变化的传播。这就像是一个复杂的多米诺骨牌装置,当你触动一个骨牌,整个装置按照既定的路径和顺序倒下。khb28资讯网——每日最新资讯28at.com

Web开发:在Web开发中,函数式编程也有其用武之地。例如,React库利用了函数式编程的概念来管理用户界面的状态,使得状态的变化可预测和可管理。khb28资讯网——每日最新资讯28at.com

并发编程:函数式编程的无状态和不可变性使得它在并发编程中非常有用。它可以帮助避免并发时常见的问题,如竞态条件和死锁。khb28资讯网——每日最新资讯28at.com

8. 如何学习函数式编程?

  1. 从基础概念开始:理解函数式编程的关键是从其基本概念开始,比如纯函数、不可变性和函数组合。就像学习任何新技能一样,掌握基础是成功的关键。
  2. 学习和实践:学习函数式编程不仅仅是理论上的,更重要的是通过实践来深化理解。尝试用函数式编程解决实际问题,就像是通过游戏来学习游泳,理论知识和实际动作的结合才能让你游得更好。
  3. 使用函数式编程语言:尝试使用像Haskell这样的纯函数式编程语言,或者在支持函数式编程的语言中使用函数式特性,比如JavaScript中的高阶函数和数组方法。
  4. 参与社区和项目:加入函数式编程的社区,参与开源项目,这可以帮助你更快地学习和应用函数式编程的概念。

结语

函数式编程是一个非常强大且具有挑战性的编程范式,它提供了一种不同的思考和解决问题的方式。虽然它可能看起来有点像是数学或者哲学,但一旦你掌握了它,就会发现它能帮你写出更清晰、更可维护、更可靠的代码。khb28资讯网——每日最新资讯28at.com


khb28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-54187-0.html一文看懂:函数式编程为何这么火?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 20行经典C代码,很多人看不明白,你来试一下?

下一篇: 数据齐舞:深入浅出分布式事务的八奇技

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
Top