速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

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

关注

评论

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

【云原生 | 从零开始学Kubernetes】十一、k8s污点、容忍度和pod状态

泡泡

Docker 云计算 云原生 k8s 9月月更

跟着卷卷龙一起学Camera--内存池浅析04

卷卷龙

ISP 9月月更

车企如何完善车载小程序生态安全

Geek_99967b

小程序

Python之类和对象(2)

梦笔生花

属性 9月月更 子类的定义

【数据结构与算法】一篇文章带你玩懂 “栈和队列”(增、删、查、改)的实现_【附源码、动图】

Dream-Y.ocean

队列 数据结构与算法 9月月更

架构模块一作业

Diana S

架构实战营

破解windows系统密码

吉师职业混子

9月月更

大模型的禾下乘凉梦,百度自己来做试验田

脑极体

研发效能之技术治理&技术治理架构师

laofo

DevOps cicd 研发效能 持续交付 工程效率

前端工程师在面试时经常被问的闭包到底是什么?我用打包礼物的例子让你秒懂

wljslmz

JavaScript 闭包 9月月更

Python语法之模块和包(1)

梦笔生花

9月月更 Python语法 模块的创建

【数据结构与算法】2道面试真题,带你领略算法思想【附思路、动图、源码】

Dream-Y.ocean

面试 链表 9月月更

【数据结构与算法】粽子树?二叉树_关于堆你不知道的事情

Dream-Y.ocean

栈和队列 9月月更

【docker】软链接迁移docker存储目录

非晓为骁

Docker 存储 迁移

千峰课程网安笔记(1)

吉师职业混子

9月月更

【编程实践】利用 Python 调用图灵机器人 API 实现实时语音聊天及自动回复

迷彩

Python 实时语音 实时聊天 9月月更

设计消息队列存储消息数据的 MySQL 表格

张立奎

这个C4D短片有点辣!热情起舞小金链尽显墨西哥黑帮气质

Renderbus瑞云渲染农场

影视制作 Renderbus瑞云渲染 3D电影制作

读书笔记|择一城以定财富,择一行以定发展

宇宙之一粟

读书笔记 职业 个人感悟 9月月更

从东南亚到中东,为什么社交类产品成为游戏出海的突破口?

融云 RongCloud

白皮书 社交网络 出海 社交娱乐

【数据结构与算法】“堆”还能这样用_堆的应用

Dream-Y.ocean

面试 9月月更

Python语法之类和对象(1)

梦笔生花

Python 9月月更 类与对象

【数据结构与算法】LeetCode面试真题,带你领略算法思想

Dream-Y.ocean

面试 队列 9月月更

跟着卷卷龙一起学Camera--内存池浅析06

卷卷龙

ISP 9月月更

【Python实践】使用Python实时语音控制电脑全局音量

迷彩

人工智能 语音识别 9月月更 控制电脑 语音控制

我也不想学之PHP系列(2)

吉师职业混子

9月月更

2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边,记录在二维数组edges里, 比如ed

福大大架构师每日一题

算法 rust 福大大

企业服务中出场率最高的活动目录AD到底是什么?本文带您好好了解一下!

wljslmz

AD 9月月更 活动目录

第一模块作业

lsf1227

「架构实战营」

rust语言写的贪吃蛇游戏

福大大架构师每日一题

rust 贪吃蛇 福大大

跟着卷卷龙一起学Camera--内存池浅析05

卷卷龙

ISP 9月月更

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