AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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

  • 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:376225
用户头像

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

关注

评论

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

近期排课分享

ShineScrum

圆柱形谐振腔的模式分析

思茂信息

cst cst仿真软件 CST软件

即时通讯初学者必知必会的20个网络编程和通信安全知识点

JackJiang

网络编程 即时通讯 IM

AD域文件权限管理

运维有小邓

IT 运维 AD域管理 文件管理权限

一个Rust小白发布生产级Rust应用的进阶之路 | 得物技术

得物技术

`后端

Elevenlabs、Hume.ai、B 站多家推出 STT/TTS 新品;Amphion 开源 20 万小时语音数据集丨日报

声网

区块链智能合约的上线

北京木奇移动技术有限公司

智能合约 区块链技术 软件外包公司

软件测试分层测试策略

测试人

中国制造+反向海淘:独立站如何靠“土特产”闷声发家?

代码忍者

25年天津正规等级保护测评机构名单大公开

行云管家

等保 等保测评 等保2.0

区块链智能合约开发的关键事项

北京木奇移动技术有限公司

区块链技术 智能合约开发 软件外包公司

快手前端通用静态托管服务 KFX 演进历程:从崎岖土路到平坦高速

快手技术

区块链智能合约开发的优化

北京木奇移动技术有限公司

智能合约 区块链技术 软件外包公司

用Golang打造高效安全金融科技后端架构

xuyinyin

AI与低代码平台:简化开发流程,加速数字化转型实施

天津汇柏科技有限公司

人工智能 AI 低代码 数字化转型

DeepSeek 开源周 “王炸”:DualPipe 与 EPLB,榨干芯片算力的秘密武器

GPU算力

DeepSeek DeepSeek v3 DualPipe 流水线并行 EPLB

Java语言程序书写规范

金陵老街

Java Vue

区块链智能合约的开发

北京木奇移动技术有限公司

智能合约 区块链技术 软件外包公司

aiXcoder完成DeepSeek深度融合,支持私有化部署和个性化定制

新消费日报

F5推出业界首款应用交付与安全一体化平台,全方位赋能 AI 时代的混合多云基础架构

科技热闻

超过321万个AOI(地理围栏),2025年2月更新,全国范围、全类别、同一来源、属性字段丰富的矢量面数据(AOI数据更新系列)

Geek_f9782a

AOI数据 全国AOI数据 2025年2月最新AOI数据 全国最新地理围栏 超过321万个地理围栏

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