【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

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

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

关注

评论

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

架构训练营模块1作业

Puciu

架构实战营

无人驾驶与环卫革命

脑极体

微信业务+学生毕设架构设计

慧慧Alina酱

微信朋友圈高性能复杂度分析

deng

架构实战营

工信部等三部委:推进区块链等新一代信息技术在养老场景集成应用

CECBC

借助人工智能、区块链 传统农业告别“靠天吃饭”

CECBC

区块链专利正从量向质转变 智慧金融、医疗健康和能源三领域质量最高

CECBC

科技热点周刊|微软发布 Web 版 VSCode、 删除 .NET 6 热重载引发不满、IBM 发布开源混合云介绍指南

青云技术社区

云计算 云原生 kubenetes CockroachDB

优酷鸿蒙开发实践|多屏互动开发实践

阿里巴巴终端技术

ios android 鸿蒙 优酷 客户端

自定义ViewGroup的触摸反馈

Changing Lin

10月月更

这才是责任链模式的优雅使用方式

Tom弹架构

Java 架构 设计模式

使用 Spring Boot 和 @WebMvcTest 测试 MVC Web Controller

码语者

Java Spring Boot test

通过题目来讲一讲指令系统相关知识 1 | 计算机组成与系统结构专题

Regan Yue

计算机组成原理 10月月更

官方线索 | 1024新华三服务器性能调优挑战赛

穿过生命散发芬芳

1024我在现场

架构实战营 - 第三期 - 模块一作业

lucian

架构实战营

微信业务架构图

罗赟

「架构实战营」

Jekyll 运行的时候提示错误 cannot load such file -- webrick (LoadError)

HoneyMoose

模块2总结

Asha

架构实战营

打破 Serverless 落地边界,阿里云 SAE 发布 5 大新特性

阿里巴巴云原生

阿里云 Serverless 云原生 Serverless Kubernetes

产学互为表里,携手方见大道:华为云AI院长峰会的价值思考

脑极体

学生管理系统架构和微信业务架构

Geek_nlp小咖

微信 架构 微信业务架构 学生管理系统架构

模块2

Asha

浪潮云说丨构建全域业务联动枢纽,挖掘数据要素创新价值

浪潮云

云计算

资讯|WebRTC M94 更新

网易云信

大前端 chrom

精细运营|营销获客自动化‘攻心’

海比研究院

CRM

打破数据壁垒,北鲲云超算混合云模式激活人工智能数据价值

北鲲云

模块一作业

hpl

如何在新消费时代提升开店数量和营业额

石云升

学习笔记 10月月更

网络安全之渗透实战学习

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

你正在选择实时互动云服务?以下是关于安全合规的七个建议

声网

人工智能 数据安全

空调可视化运营中心,赋能精细化运营管理

ThingJS数字孪生引擎

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