2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

函数式编程为何越来越受到重视

  • 2013-07-19
  • 本文字数:1659 字

    阅读完需:约 5 分钟

函数式编程受到越来越多的关注,软件架构师 Neal Ford分析了其中的原因。

Neal Ford 首先强调,函数式编程的特点之一是存在强大的抽象,它隐藏了许多日常操作的细节(比如迭代)。用抽象来处理迭代等任务,使得需要维护的代码变得更少,因此可能出现错误的地方也就更少。

Java 开发人员习惯于框架 级别的重用;在面向对象的语言中进行重用所需的必要构件需要非常大的工作量,他们通常会将精力留给更大的问题。函数式语言在更细化的级别提供重用,在列表和映射等基本数据结构之上通过高阶函数提供定制,从而实现重用。

在面向对象的命令式编程语言中,重用的单元是类以及与这些类进行通信的消息,这些信息是在类图中捕获的。在 OOP 的世界中,鼓励开发人员创建独特的数据结构,以方法的形式附加特定的操作。

函数式编程语言尝试采用不同的方式来实现重用。它们更喜欢一些关键的数据结构(如列表、集和映射),并且在这些数据结构上采用高度优化的操作。传递数据结构和高阶函数,以便 “插入” 这种机制,针对某一特定用途对其进行定制。

函数级的封装支持在比构建自定义类结构更细的基础级别上进行重用。此方法的优势之一已经体现在 Clojure 中。最近,库中的一些巧妙创新重写了 map 函数,使它可以自动并行化,这意味着所有映射操作都可以受益于没有开发人员干预的性能提升。

Neal Ford 举了一个解析 XML 的例子。大量的框架可用于在 Java 中完成这个任务,每个框架都有自定义的数据结构和方法语义(例如,SAX 与 DOM)。

Clojure 将 XML 解析为一个标准的 Map 结构,而不是强迫您使用自定义的数据结构。因为 Clojure 中包含大量与映射配合使用的工具,如果使用内置的列表理解函数 for,那么执行 XPath 样式的查询就会很简单。

最初,Clojure 中令人生畏的细节之一是:与映射和其他核心数据结构进行交互的方法似乎有无限多种。然而,它反映了这样一个事实:在 Clojure 中,大多数内容都尝试解决这些核心的、优化的数据结构。它没有将解析的 XML 困在一个独特的框架中,相反,它试图将其转换为一个已存在相关工具的现有结构。

其次,函数式编程提供了新的工具类型,以优雅的方式解决棘手的问题。例如,Java 开发人员不习惯尽能延迟生成其值的惰性 数据结构。而未来的函数式语言将对这种高级特性提供支持,一些框架将此功能加装到 Java 中。

第三点是让语言迁就问题,大多数开发人员都将他们的工作误解为接受一个复杂的业务问题,将它转换成 Java 等语言。

他们的这种误解是因为 Java 并不是一种特别灵活的语言,它迫使您让自己的想法适应于已经存在的刚性结构。但是,当开发人员使用可塑语言时,他们看到了让语言迁就问题,而不是让问题迁就语言的机会。像 Ruby(它为领域特定语言 (DSL) 提供了比主流更友好的支持)等语言证明了这种潜在可能。现代函数式语言甚至走得更远。Scala 旨在协调内部 DSL 的托管,并且所有 Lisp(包括 Clojure)都可以提供无与伦比的灵活性,使开发人员能够让语言适应问题。

最后一点是与语言的趋势相一致,函数式编程的目标之一是最大程度地减少可变状态。像垃圾收集一样,现在缓存也可以降级用于语言。

由于运行时获得了更多的能力并且有多余的开销,开发人员可以将繁忙的工作割让给语言,将我们解放出来,去思考更重要的问题。Groovy 中的备忘功能就是众多示例中的一个;因为基础运行时允许这样做,所有现代语言都添加了函数式构造,包括 Totally Lazy 等框架。

微软的函数式编程语言 F#最近随 Visual Studio 2013 预览版发布了 3.1 版本。3.1 版的主要新增语言特性:

  • 命名的联合类型字段——现在可以为每个联合类型中的联合字段命名
  • 数组切片扩展——之前的数组切片只能用于同等维度的数组,现在这不是必须的了
  • 为 LINQ 风格的方法增强了类型推断——改进了 F#中使用函数作为参数的重载方法的类型推断
  • 支持第一个参数为类型参数的 C#风格的扩展方法——3.1 支持使用扩展方法(this 关键字),比如:static member M(this T input, T other)
  • 在特性和字面量表达式中对常量进行组合——比如,可以使用“+”来连接字符串,或对枚举标记进行按位 OR 操作(|||)
2013-07-19 10:376295
用户头像

发布了 501 篇内容, 共 270.7 次阅读, 收获喜欢 62 次。

关注

评论

发布
暂无评论
发现更多内容

【第八周】性能优化(二)

云龙

LeetCode题解:169. 多数元素,排序,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

第四周作业

晴空万里

第八周

Geek_fabd84

网上如何精确分别百家电投台子真假靠谱方法(LGF微7998)

InfoQ_ba4217df53b1

第八周作业一

天天向上

极客大学架构师训练营

在GitHub中如何进行PR(Pull Request)

jiangling500

GitHub PR

架构师训练第4周:作业二

leo

极客大学架构师训练营

第八周作业

极客大学架构师训练营

架構師訓練營 week8 總結

ilake

Netty源码解析 -- PoolChunk实现原理(jemalloc 3的算法)

binecy

源码 Netty 内存管理

架构师训练第4周:作业一

leo

极客大学架构师训练营

架构师训练营-week08

睁眼看世界

极客大学架构师训练营

架构师训练营第八周学习总结

Gosling

极客大学架构师训练营

它是世界上最好的语言,吊打PHP那种

MySQL从删库到跑路

php 少儿编程 scratch

架构师训练营第 1 期 week8

张建亮

极客大学架构师训练营

亚新资本开创金融理财新征程

Wi-Fi+BLE 通断器开发资料全开源!快速打造您的智能家居“改装神器”

智能物联实验室

人工智能 物联网 智能家居 通断器

架构师训练营第八周课后作业

Gosling

极客大学架构师训练营

性能优化二第八周作业「架构师训练营第 1 期」

天天向善

架构师训练营 -week08-总结

大刘

极客大学架构师训练营

系统架构总结

Mars

系统架构

架构师训练营第四周作业

丁乐洪

为什么继承 Python 内置类型会出问题?!

Python猫

c Python 编程 程序员

架构师训练营第 1 期第八周总结

Leo乐

极客大学架构师训练营

架构师系列之5:互联网大数据分析系统架构例子解析

桃花原记

深度学习-框架之 pytorch

Dreamer

框架

Week 8总结

黄立

GitHub SSH免密登录

jiangling500

GitHub SSH 免密登录

大型互联网系统技术架构模式

Mars

架构模式 大型互联网应用系统

架构师训练营第一期第八周作业

Leo乐

极客大学架构师训练营

函数式编程为何越来越受到重视_Java_崔康_InfoQ精选文章