怎么理解函数式编程思维?

文章目录


在这里插入图片描述

(2023年9.29号,正月十五家乡的月亮)


理解函数式编程要注重思维的转变。函数式编程聚焦于简洁的高阶函数,高阶函数注重封装底层运作原理来解决复杂的业务场景,比如 Scala、Groovy、Clojure 语言:

在这里插入图片描述

静态类型必须先指定变量和函数的类型,而动态类型则允许推迟指定类型。强类型的变量“知道”自己的类型,允许反射和对实例作类型测试,且一直保有自身的类型信 息。弱类型的语言相对不了解变量所指向的内容。

命令式告诉计算机执行的步骤,一步一步告诉它怎么做。函数式更注重“做什么”本身,函数式编程是面向数学的抽象,函数式的代码里只有函数和数据。

函数式编程提供以下几个特性,让开发抛开细节,投入到更高的抽象工作中:

  • 高阶函数
  • 闭包:由函数(环境)及其封闭的自由变量组成的集合体,比如 Java Script 和 Groovy 都提供了闭包的概念。
  • 柯里化和函数的部分施用:柯里化指的是从一个多参数函数变成一连串单参数函数的变换。部分施用指通过提前代入一部分参数值,使一个多参数函数得以省略部分参数,从而转化 为一个参数数目较少的函数。
  • 递归: 命令式与函数式最大一个区别是,当需要重复做一件事时,命令式喜欢用循环,而函数式更偏好递归。
  • Stream 和作业顺序重排
  • 记忆(memoization)和缓求值(laziness): 类似于命令式编程的缓存,Groovy、Clojure 都提供了记忆的功能。

函数式语言的重用表现在函数的通用性上,它们鼓励在数据结构上使用各种共通的变换,并通过高阶函数来调整操作以满足具体事项的要求。比如函数式编程语言用一组关键数据结构(如 list、 set、map)来搭配专为这些数据结构深度优化过的操作,基于这些关键数据结构和操作组成的一套运转机构上面,按需要“插入”另外的数据结构和高阶函数来调整机器来解决具体的问题。再比如函数式编程语言提供了如 Either 类、Option 类来优化异常处理问题等。

​ 在模式与重用方面,Java 提供了经典的 23 种设计模式来解决复杂的业务问题,函数式编程让这些设计模式有了三种归宿:

  • 模式被吸收成为语言的一部分。针对于工厂模式,Groovy 语言直接提供的高阶函数特性可以让我们节约大量的八股代码。针对工厂模式,在设计模式的语境下,柯里化相当于产出函数的工厂。针对策略模式, Groovy 语言以代码块定义的形式为开发提供了便利。
  • 模式中描述的解决办法在函数式范式下依然成立,但实现细节有所变化。针对享元模式,函数式编程提供的记忆功能发挥了重要作用。
  • 由于在新的语言或范式下获得了原本没有的能力,产生了新的解决方案

​ 现实应用方面,Java8 提供了基于 lamda 表达式的函数式编程,但 Java 非函数式编程语言,Java 将问题域封装在对象之内,并允许通过业务操作来改变对象的状态,完全与函数式编程“变量无状态”的思想背道而驰。那么函数式编程能应用于企业级需求解决方案吗?从另一个角度来思考,Java 是面向对象的的编程语言,领域驱动设计(DDD)是面对企业级需求的解决方案,DDD 的战术设计趋向于 CQRS 架构,而基于“变量不可变”的特性的函数式编程把 CQRS 架构作为基础设施,所以能把函数式编程视为企业级需求的解决方案吗?很明显不能,DDD注重模拟现实世界,函数式编程思维并没有试图模拟现实世界,所以无法满足复杂的企业需求,函数式编程大处理大量数据方面比面向对象方式更具有效率,正解是面向对象编程是解决企业级需求的解决方案,解决过程中会产出大量的数据需求,可借力函数式编程。另外,《函数式编程思维》作者提到多范式语言组合才是趋势,这一点很认同,未来语言必是混合的。编程语言是我们在计算机世界里解决问题的工具,函数式更注重What而命令式更注重How。对于解决问题的能力,没有高低强弱之分,只是角度和工具不同而已。

附:《函数式编程思维》读书笔记
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webrtc gcc算法(1)

老的webrtc gcc算法,大概流程: 这两个拥塞控制算法分别是在发送端和接收端实现的, 接收端的拥塞控制算法所计算出的估计带宽, 会通过RTCP的remb反馈到发送端, 发送端综合两个控制算法的结果得到一个最终的发送码率,并以…

iZotope RX 10for Mac /Windows- 音频修复的终极解决方案

随着音乐和电影制作的复杂性日益增加,高质量的音频修复变得越来越重要。iZotope RX 10,作为业界公认的专业音频修复软件,为你提供了强大、精确的工具,让你的声音变得清晰、纯净。 在音频修复领域,iZotope RX 10凭借其…

国产低功耗MCU芯片:Si24R03

Si24R03集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块,是一款高度集成的低功耗SOC片。 应用领域: 1、物联网 2、智N门锁 3、电机控制 4、消费电子 5、工业控制 其无线收发器模块是专为低功耗无线场合设计,在关…

maven聚合和继承

一、什么是maven的聚合和继承&why 随着技术飞速发展,各类用户对软件的要求越来越高,软件也变得越来越复杂。 软件设计人员往往会采用各种方式对软件划分模块,已得到更加清晰的设计及更高的复用性。 当把Maven应用到实际项目中的时候&am…

CCF ChinaSoft 2023 论坛巡礼|形式验证@EDA论坛

2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

uni-app:实现当前时间的获取,并且根据当前时间判断所在时间段为早上,下午还是晚上

效果图 核心代码 获取当前时间 toString()方法将数字转换为字符串 padStart(2, 0):padStart()方法用于在字符串头部填充指定的字符,使其达到指定的长度。该方法接受两个参数:第一个参数为期望得到的字符串长度,第二个参数为要填充…

pytorch教程

文章目录 1 pytorch的安装2 PyTorch基础知识2.1 张量简介2.2 初始化2.3 张量的属性2.4 ndarray与tensor互转2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置 3 pytorch自动微分4 线性回归5 分类5.1 写法一5.2 写法二 1 pytorch的安装 pytorch官网 https://pytorch.org/get-…

5256C 5G终端综合测试仪

01 5256C 5G终端综合测试仪 产品综述: 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能,支持5G终端的产线高速校准及终端发射机…

Simple RPC - 02 通用高性能序列化和反序列化设计与实现

文章目录 概述设计实现通用的序列化接口通用的序列化实现【推荐】 vs 专用的序列化实现专用序列化接口定义序列化实现 概述 网络传输和序列化这两部分的功能相对来说是非常通用并且独立的,在设计的时候,只要能做到比较好的抽象,这两部的实现…

全光谱护眼灯有哪些?2023全光谱护眼台灯推荐

随着电子设备的不断普及,手机、平板电脑、显示器、电视机等几乎是家家户户的必备品,也正因为眼睛有那么多时间、那么多机会去盯着屏幕,所以如今近视低龄化现象也越来越严重了。随着科技的不断发展,台灯的发展也越来越多样化&#…

成都瀚网科技有限公司:开抖音店铺有哪些注意事项?

成功经营一个小店不仅仅是发布产品视频那么简单,还需要注意一些重要的事情。开抖音店铺需要注意以下几点: 1、开抖音店铺有哪些注意事项? 合规管理:在抖音开店,首先要确保自己的运营合规。遵守相关法律法规及平台规定&…

Elasticsearch学习笔记

1.核心概念 bucket: 一个数据分组(类似于sql group by以后的数据)metric:对bucket执行的某种聚合分析的操作,比如说求平均值,最大值,最小值。一些系列的统计方法(类似 select count(1) MAX MIN AVG) 请…

CUDA学习笔记5——CUDA程序错误检测

CUDA程序错误检测 所有CUDA的API函数都有一个类型为cudaError_t的返回值&#xff0c;代表了一种错误信息&#xff1b;只有返回cudaSuccess时&#xff0c;才是成功调用。 cudaGetLastError()用来检测核函数的执行是否出错cudaGetErrorString()输出错误信息 #include <stdi…

【lesson13】进程控制初识

文章目录 进程创建 进程创建 请你描述一下&#xff0c;fork创建子进程操作系统都做了什么&#xff1f; fork创建子进程&#xff0c;系统里多了一个进程&#xff0c;进程 内核数据结构 进程代码数据&#xff0c;内核数据结构由OS维护&#xff0c;进程代码数据一般由磁盘维护。…

【三维重建】DreamGaussian:高斯splatting的单视图3D内容生成(原理+代码)

文章目录 摘要一、前言二、相关工作2.1 3D表示2.2 Text-to-3D2.3 Image-to-3D 三、本文方法3.1生成式 高斯 splitting3.2 高效的 mesh 提取3.3 UV空间的纹理优化 四. 实验4.1实施细节4.2 定性比较4.3 定量比较4.4 消融实验 总结&#xff08;特点、局限性&#xff09; 五、安装与…

【框架源码篇 01】Spring源码-手写IOC

Spring源码手写篇-手写IoC 一、IoC分析 1.Spring的核心 在Spring中非常核心的内容是 IOC和 AOP. 2.IoC的几个疑问? 2.1 IoC是什么&#xff1f; IoC:Inversion of Control 控制反转&#xff0c;简单理解就是&#xff1a;依赖对象的获得被反转了。 2.2 IoC有什么好处? IoC带…

[ROS2系列] ORBBEC(奥比中光)AstraPro相机在ROS2进行rtabmap 3D建图

目录 背景&#xff1a; 一、驱动AstraPro摄像头 二、安装rtabmap error1&#xff1a;缺包 三、尝试 四、参数讲解 五、运行 error2: Did not receive data since 5 seconds! 六、效果​编辑 error4: 背景&#xff1a; 1、设备&#xff1a;pc&#xff1b;jeston agx …

语音芯片KT142C两种音频输出方式PWM和DAC的区别

目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片&#xff0c;输出方式&#xff0c;无外乎两种&#xff0c;即dac输出&#xff0c;或者PWM输出 其中dac的输出&#xff0c;一般应用场景都是外挂功放芯片&#xff0c;实现声音的放大&#xff0c;比如常用的音箱…

WMS透明仓库:实现仓储的全方位可视化与优化

一、WMS透明仓库的定义与特点 1. WMS透明仓库的定义&#xff1a;WMS透明仓库是一种基于信息技术的仓库管理系统&#xff0c;通过实时数据采集、分析和可视化&#xff0c;将仓库内外的物流流程、库存状态、人员活动等信息以透明的方式展示给相关利益方。 2. 实时数据采集&…

性能评测 | GreatDB VIP PLUGIN方案 VS MySQL InnoDB Cluster高可用方案

前言 最近&#xff0c;我们与许多数据库用户进行了沟通和调研&#xff0c;了解到&#xff0c;目前仍有相当一部分投产的MySQL高可用或故障转移方案&#xff0c;用到了读写分离功能或业务接入VIP&#xff08;Virtual IP Address&#xff09;的方式&#xff0c;来屏蔽后端数据库架…