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

探索函数式编程范式的力量

来源: 责编: 时间:2024-04-02 17:19:33 230观看
导读译者 | 李睿审校 | 重楼 与以状态更改和副作用为中心的命令式和面向对象编程相比,函数式编程范式提供了一种根本不同的方法,通过在不可变数据上组合独立的纯数学函数来构建软件。函数式编程的概念源于Lambda演算,强调修

译者 | 李睿J7i28资讯网——每日最新资讯28at.com

审校 | 重楼 J7i28资讯网——每日最新资讯28at.com

与以状态更改和副作用为中心的命令式和面向对象编程相比,函数式编程范式提供了一种根本不同的方法,通过在不可变数据上组合独立的纯数学函数来构建软件。函数式编程的概念源于Lambda演算,强调修饰性而不是突变性J7i28资讯网——每日最新资讯28at.com

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

近年来,受到多核计算系统和高性能声明性架构支持的大规模并发性需求的推动,函数式编程获得了越来越多的主流认可。本文深入探讨了开发人员对函数式思维日益增长的兴趣背后的基本动机,考察了Facebook、Netflix和Airbnb等全球领先企业将函数式语言纳入关键管道的使用原则和吸引力,以及通过不变性释放固有并发性等好处,支持高阶函数和柯里化(Currying)等数学抽象、迭代循环的递归、模式匹配、务实的采用权衡(例如再培训成本和控制流转移),以及函数式编程在复杂性使现有范例紧张的情况下仍能更广泛渗透的原因。J7i28资讯网——每日最新资讯28at.com

  • 函数式编程:函数式编程范式以建模计算为中心,作为对纯数学函数的严格评估,没有可变状态或可观察到的副作用。与命令式编程和面向对象编程不同,函数式编程将解决方案构建为确定性数据流管道,通过无状态函数将不可变的输入处理为新的输出。
  • 在评估过程中不会修改可变状态,所有更改仅限于本地调用帧内的堆栈分配内存,而不是外部对象。这种独立的确定性通过消除与副作用相关的级联外部状态依赖,极大地简化了调试、优化和并行化。此外,内置的数学语言原语(例如集合、列表、元组、映射和递归)提供了丰富的可组合抽象,非常适合当今的数据转换需求。
  • 与语言不同的一等(First-Class)函数:在函数只作用于数据的情况下,函数编程将函数本身视为一等值,从而实现更高阶的功能。函数可以作为参数传递给其他函数,作为函数调用的结果返回,赋值给变量,或存储在列表和字典等数据结构中。这促进了无参(point-free)、可重用的模块化架构在这种架构中,通过将小型无状态纯函数绑定到声明性管道中来构建程序,每个函数都掩盖了潜在的复杂性。
  • 递归迭代函数式语言:明确支持递归函数调用自身,而不是传统的迭代循环结构。递归允许通过数学抽象优雅地表达某些算法,例如树遍历。尾部调用优化特性确保递归不会累积不断增长的堆栈开销。此外,与有副作用的有状态循环相比,无状态递归对不可变结构的确定性简化了测试和可调试性。

为什么领先的企业采用函数式编程通过隔离外部状态依赖关系的不变性简化并发性?

函数式编程本质上支持多核基础设施上的简单并发性,而不会出现线程间共享可变状态的复杂性,也不需要显式锁定和同步。通过设计,即使开发人员不了解低级的线程语义不变性使逻辑在本质上可以跨内核并行化。这表现为高度并行域的协调复杂性的大幅降低。J7i28资讯网——每日最新资讯28at.com

  • 增强的可靠性数学:没有可观察到的副作用的基础导致完全确定的代码执行,消除了所有类别的与状态相关的潜在错误。与共享可变状态的隔离可以通过消除对外部因素的依赖来实现详尽的测试。这些可靠性优势在金融、航空航天和医疗保健等风险敏感领域得到充分利用,在这些领域,缺陷率直接转化为成本。
  • 改进的模块化严格性:函数内的状态封装通过消除组件之间的耦合来促进重用,从而允许跨不同用例的链接。通过支持来自无状态组合子的可组合管道,高阶功能进一步增加了收益。MapReduce范式大规模地应用了这一点。微服务架构同样利用服务之间的不可变无状态来实现松耦合。
  • 数学上的可访问抽象:与改变索引和计数器的有状态命令循环相比,映射、折叠、过滤和压缩等面向对象的数据转换提供了集合的声明性操作。通过递归调用表示算法在认知上也比充满副作用的迭代更容易。这些将抽象推向问题空间,减少了与状态管理相关的偶然复杂性。
  • 选择专业的函数式语言:虽然函数式编程的思想不断渗透到主流语言中,但专门的语言通过构建其核心的函数能力而脱颖而出。其突出的例子包括:

Haskell静态类型非严格纯函数式语言以不变性为中心,支持惰性评估和高级类型系统,提供简洁、高性能的抽象,并广泛用于研究、量化金融,密码学和分析。J7i28资讯网——每日最新资讯28at.com

Scala在Java虚拟机(JVM)上混合面向对象和函数式风格

独特地支持可更新的变量和不可变的变量,使混合命令式和功能模型迎合实用主义和功能纯度。在数据工程和分布式系统中被广泛采用。J7i28资讯网——每日最新资讯28at.com

1.F#

F#是一种强类型多范式.NET语言,在支持.NET运行时的同时应用函数式编程实践。与C#的互操作性使旨在利用函数优势的程序人员可以采用它。在科学、分析、机器学习和量子计算编程方面获得突出地位。J7i28资讯网——每日最新资讯28at.com

2.Elm

Elm是专为前端Web开发设计的纯函数式语言,专注于基于响应式浏览器的用户界面的不变性。与JavaScript的互操作性使集成易于访问,从而促进了采用。Elm演示了在数据处理后端之外的实际用户界面(UI)编程的功能适用性。J7i28资讯网——每日最新资讯28at.com

关键概念和技术

不变性函数式编程的基础是不变性:J7i28资讯网——每日最新资讯28at.com

  • 没有变量允许可变更新。结构突变克隆并返回修改后的副本,同时保持原始输入不变以隔离副作用。这使得状态管理方法发生了变化,但允许对跨功能的数据流进行本地推理。
  • 高阶函数支持函数作为一等参数和返回值,有助于实现强大的抽象例如映射、折叠、柯里化(Currying)和组合。这使得通过一系列转换步骤将处理数据的管道链接在一起成为可能。Lambda抽象进一步简化了内联函数定义,而不需要先绑定到名称。

像尾部调用优化这样的核心递归技术确保递归算法不会累积不断增长的堆栈,从而消除了传统迭代循环结构的开销。递归普遍适用于线性和非线性数据结构,例如支持声明式遍历分支的树。记忆法通过保留预先计算的重叠子问题的中间结果进一步优化递归。J7i28资讯网——每日最新资讯28at.com

  • 模式匹配提供了针对值和类型的变量的简明条件赋值,同时解构了跨案例的复杂结构。这消除了其他语言中切换大小写样式条件的冗长性。不相交的穷举模式匹配案例也通知类型系统对完整性进行推理。
  • 柯里化(Currying)允许分解函数,并将多个参数放入函数链中,每个参数通过部分应用程序接受一个参数。这通过更小的可重用单元扩展了可组合性。嵌套和作用域控制规则决定了在柯里化边界间流动的参数和返回类型。
  • 应用和单子接口。应用程序函数和单子提供了标准的接口结构,用于将类似场景传递的配置和状态封装到纯函数代码中,以最大限度地减少冗长性。这些抽象促进了来自不同开发人员的互操作库,从而通过共享接口构建复杂的应用程序。突出的实现抽象地管理异步场景、并发进程、错误处理和缓冲IO管道。
  • 务实的采用权衡,在通过可组合的并发性和函数纯度提高生产力的同时,还围绕内存利用率进行权衡因为在链接调用时,临时对象被快速分配,而不是在适当的地方改变状态。控制流也从显式的有状态命令式风格转变为不可变流上的管道流。因此,采用者将函数功能逐渐构建到现有的命令式和面向对象的代码库中。支持混合模式的语言允许函数式和命令式技术的平衡混合,从而简化了这种迁移路径。最终,在采用过程中,问题分析和架构分解范式转换带来了比语法本身更高的成本。但是数学上的可靠性和并发性的提高已经使得函数能力渗透到不同的语言中,并成为Apache Spark、React和Tensorflow等框架的基础,为当今的关键大型应用程序提供服务。

结论

函数式编程应用以组合传递不可变数据的纯无状态函数为中心的数学基础,以构建具有固有并发性支持的无副作用程序。由于复杂性在多核和分布式系统的扩散中使以前的开发范式变得紧张,函数技术提供了经过验证的、正式可验证的关于透明性、健壮性和利用纯粹原则的维度可扩展性的保证。专用的函数式语言推动了前沿领域的创新,而主流的采用逐渐建立了对限制副作用和可变性的关键技术的熟悉,为业务逻辑解构提供了更安全的封装。由于不变性和基于复制的架构与分布式一致性需求很好地结合在一起,随着复杂性使全球数据密集型和异构技术环境中的现有方法面临问题和压力,函数式编程仍有望成为未来具有深远影响的编程范式,从而实现更广泛的渗透。J7i28资讯网——每日最新资讯28at.com

原文标题:Exploring the Power of the Functional Programming Paradigm,作者:Igboanugo David UgochukwuJ7i28资讯网——每日最新资讯28at.com


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

本文链接:http://www.28at.com/showinfo-26-80847-0.html探索函数式编程范式的力量

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

上一篇: 基于Spring Boot 2 使用WebSocket发送图片

下一篇: 浅谈G行科技客服发展之路

标签:
  • 热门焦点
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top