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

文章目录


在这里插入图片描述

(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凭借其…

Python 简单并发的代码记录

简单介绍 近期想优化一下API的请求,顺带测试一下并发编程能快多少,用到进程、线程,顺带保留一些直接可用的简单的并发代码,方便后期复制粘贴 1、urllib3 网络请求 2、获取函数执行时间(大致的) 3、进程的…

国产低功耗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-…

【C++程序员必修第一课】C++基础课程-12:std::array 固定数组

1 本课主要内容&#xff1a; std::array 固定数组的声明基本使用&#xff1a;赋值、访问数组、遍历等 2 主要知识点&#xff1a; std::array 固定数组的声明 #include <array>// std::array 固定数组例子 std::array<int, 5> array1; // 未…

5256C 5G终端综合测试仪

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

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

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

Linux高性能服务器编程——ch5笔记

第5章 Linux网络编程基础API 5.1 socket地址API 主机字节序&#xff08;小端字节序&#xff09;&#xff1a;整数的高位字节存储在内存的高地址处&#xff0c;而低位字节则存储在内存的低地址处。 网络字节序&#xff08;大端字节序&#xff09;&#xff1a;相反。 void byt…

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

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

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

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

关于yield你只需要知道这2点

1.yield是放在函数里面的&#xff0c;且带有yield的函数就叫做生成器&#xff0c;这时函数就成了一个对象&#xff0c;而不能把它作为函数来对待 def foo(num):print("introduction:")while:if num < 10:num 1yield num g foo()看上面的代码&#xff0c;我们把…

Python 基础问题

文章目录 python 中有哪些类型或数据结构什么是有序和无序什么是可变和不可变字典中&#xff0c;什么类型可以当做key去使用闭包是什么装饰器是什么 python 中有哪些类型或数据结构 在 Python 中&#xff0c;有多种类型和数据结构可用于存储和组织数据。以下是一些常见的类型和…

golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook)

logrus 介绍一个golang 日志框架logrus 支持文本与JSON数据格式支持结构化记录支持hook 文档介绍 logrus文档 std 官方案例介绍了如何配置std打印 package mainimport ("os"log "github.com/sirupsen/logrus" )func init() {// Log as JSON instead…

Unoconv入门介绍和问题汇总

简介&#xff1a;Unoconv是一款基于LibreOffice/ Openoffice开发的命令行工具&#xff0c;可以将不同格式的文件&#xff08;如DOC、PPT、PDF等&#xff09;在不同的操作系统上通过Libreoffice/Openoffice转换为PDF、ODT、DOC、PNG、PPTX等格式&#xff0c;并支持在命令行中指定…

Elasticsearch学习笔记

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

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

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