常见的函数式编程操作

news2025/4/9 4:12:40

1、柯里化: (概念 & 应用 & 好处)

柯里化的概念:

柯里化(Currying)是把接受多个参数的函数变成接受单一参数的函数,并且返回一个用于接受剩余参数的新函数,当参

数都传递完成后, 则立即返回函数执行结果。

function getSum(a,b){

return a+b

}

getSum(1,2)

getSum(1,3)

getSumm(1,4)

此时,如果我们的相加的基准一直都是某一个固定的值,比如1的话,就会一直重复1,为了避免重复,继续对函数进行

改造:
 

function getSum(a){

return function(b){

return a+b

}

}

let getSum1=getSum(1)

getSum1(2)

getSum1(3)

利用Lodash库实现函数柯里化

const _ = require('lodash')

const getSum = function (a, b, c) {

return a + b + c;

};

const curried = _.curry(getSum);

curried(1)(2)(3);

// => 6

curried(1, 2)(3);

// => 6

curried(1, 2, 3);

// => 6

lodash中的柯里化函数

_.curry(func)

参数:需要柯里化的函数

返回值:柯里化后的函数

功能:创建一个函数,该函数接收一个或多个func的参数,如果func所需要的参数都被提供,则执行func并返回执行的结果,

否则继续返回该函数并等待接收剩余的参数

通常,我们在实践中使用柯里化都是为了把某个函数变得单值化,这样可以增加函数的多样性,使得其适用性更强:

const _ = require('lodash');

const replace = _.curry(function(what, replacement, str) {

return str.replace(what, replacement);

});

const replaceSpaceWith = replace(/\s*/);

const replaceSpaceWithComma = replaceSpaceWith(',');

const replaceSpaceWithDash = replaceSpaceWith('-')

通过上面这种方式,我们从一个 replace 函数中产生很多新函数,可以在各种场合进行使用。

柯里化的原理

function curryIt(fn) {

return function curryFun(...args) {

if (args.length < fn.length) {

return function () {

return curryFun(...args.concat([...arguments])

}

}

return fn(...args)

}

}

function add(a, b, c) {

return '调用了';

}

var c = curryIt(add);

var c1 = c(1);

var c2 = c1(2);

var c3 = c2(3);

console.log(c3); // 调用了

由此我们可以看出,柯里化是一种“预加载”函数的方法,通过传递较少的参数,得到一个已经记住了这些参数的新函数,

某种意义上讲,这是一种对参数的“缓存”,是一种非常高效的编写函数的方法!

柯里化的优点

柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数

这是一种对函数参数的缓存

让函数变的更灵活,让函数的粒度更小

可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能

函数组合的概念:

定义:如果一个函数要经过多个函数处理才能得到最终值,这个时候可以把中间过程的函数合并成一个函数

有时候我们会写出洋葱代码,即一层套一层的方法h(g(f(x)))。

[]例如实现一个具体的场景:找出数组的最后一个元素:_.first(_.reverse(array)),这种多次嵌套就是洋葱代码,为了解

决这种状况,需要使用函数组合

题目一:找出数组中的最后一个元素

function reverse(array){

return array.reverse()

}

function first(array){

return array[0]

}

// 一般调用

first(reverse([1,2,3]))

// 函数组合调用

const last = compose(first,reverse)

console.log(last([1,2,3]))

// 函数组合

function compose(f,g){

return function(value){

return f(g(value))

}

}

利用Lodash库实现函数组合:

lodash中组合函数flow()和flowRight(),它们都可以组合多个函数,flow()是从左到右运行,flowRight()是从右到左运

行。

const _= require('lodash')

const reverse =arr=>arr.reverse()

const first = arr=>arr[0]

const f= _.flowRight(first,reverse)

// const f= _.flow(reverse,first)

console.log(f([1,2,3]))

函数组合的原理(模拟实现 lodash中的 flowRight() ):

const reverse =arr=>arr.reverse()

const first = arr=>arr[0]

function compose(...fns) {

return function (x) {

return fns.reverse().reduce(function (arg, fn) {

return fn(arg);

}, x)

}

}

const compose=(...args)=>value=>args.reverse().reduce((acc,fn)=>fn(acc),[])

const f = compose(first,reverse)

console.log(f([1,2,3]))

推荐教程:两小时快速掌握函数式编程

 

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

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

相关文章

Linux 文件权限讲解

目录 文件的一般权限 一般权限有哪些 使用ls -l查看文件/目录权限 配置一般权限和文件所属信息 chmod 修改文件权限 chown 修改文件所属信息&#xff08;所有者和所属组&#xff09; 文件特殊权限 SUID 针对所有者的特殊权限 SGID SBID 配置特殊权限 文件的隐藏权限…

智能网联汽车ASIL安全等级如何划分

目录一、功能安全标准二、功能安全等级定义三、危险事件的确定四、ASIL安全等级五、危险分析和风险评定六、功能安全目标的分解一、功能安全标准 ISO 26262《道路车辆功能安全》脱胎于IEC 61508《电气/电子/可编程电子安全系统的功能安全》&#xff0c;主要定位在汽车行业&…

qt 配置open3d

一、配置前要先编程open3d二、开始配置新建txt 把txt 修改为 pri在pro 文件中添加 include(F:/xuwanlu/control.pri)重新构建项目然后回多出来pri在pri中添加open3d目录INCLUDEPATH F:\open3d\include\Open3D\3rdparty\GLFW\include \F:\open3d\include\Open3D\3rdparty\gle…

Golang 给视频添加背景音乐 | Golang工具

目录 前言 环境依赖 代码 总结 前言 本文提供给视频添加背景音乐&#xff0c;一如既往的实用主义。 主要也是学习一下golang使用ffmpeg工具的方式。 环境依赖 ffmpeg环境安装&#xff0c;可以参考我的另一篇文章&#xff1a;windows ffmpeg安装部署_阿良的博客-CSDN博客 …

当你按下方向键,电视是如何寻找下一个焦点的

我工作的第一家公司主要做的是一个在智能电视上面运行的APP&#xff0c;其实就是一个安卓APP&#xff0c;也是混合开发的应用&#xff0c;里面很多页面是H5开发的。 电视我们都知道&#xff0c;是通过遥控器来操作的&#xff0c;没有鼠标也不能触屏&#xff0c;所以“点击”的…

ChatGPT已应用到跨境电商领域,规模化运营指日可待

最近各大平台都卷起了一股“ChatGPT”的热潮&#xff0c;论坛、贴吧、微博甚至短视频都对这个新兴的东西津津乐道&#xff0c;在这些评论区里我们可以发现&#xff0c;不管说什么职业&#xff0c;不管年龄性别&#xff0c;ChatGPT都开始被许多人关注。那么ChatGPT到底是个什么东…

大数据框架之Hadoop:HDFS(五)NameNode和SecondaryNameNode(面试开发重点)

5.1NN和2NN工作机制 5.1.1思考&#xff1a;NameNode中的元数据是存储在哪里的&#xff1f; 首先&#xff0c;我们做个假设&#xff0c;如果存储在NameNode节点的磁盘中&#xff0c;因为经常需要进行随机访问&#xff0c;还有响应客户请求&#xff0c;必然是效率过低。因此&am…

FPGA入门系列17--task

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…

如何选择传感器输出模式——电流输出还是电压输出?

一 背景及挑战 传感器在汽车测试系统中发挥着信息的采集和传输作用&#xff0c;可以称为汽车的“神经元”。 按照功能可以将传感器分为压力传感器、流量传感器、温湿度传感器和电流传感器等。传感器的主要指标是精度、测量范围和响应时间等。在满足指标的情况下&#xff0c;通…

御黑行动来袭--助力三月重保,构筑安全防线!

三月重保在即&#xff0c;重要网站及业务系统“零风险 零事故”是终极目标&#xff0c;作为业界网络安全实战派“老兵”--知道创宇将一如既往&#xff0c;为您提供重保期间“万无一失”的重要网站及业务系统防护。 值此三月重保的重要备战期&#xff0c;知道创宇推出由主力产品…

高灵敏度压电传感器频率温度特性测量中的TEC型精密温控系统

摘要&#xff1a;为解决石英晶体微量天平这类压电传感器频率温度特性全自动测量中存在的温度控制精度差和测试效率低的问题&#xff0c;本文在TEC半导体制冷技术基础上&#xff0c;提出了小尺寸、高精度和全自动程序温控的解决方案&#xff0c;给出了温控装置的详细结构和实现高…

计算机网络常见面试题总结

网络分层结构 计算机网络体系大致分为三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。 TCP/IP五层模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层。 应用层&#xff1a;为应用程序提供交互服务。在互联网中的…

一、产品经理——【岗位和能力要求】【项目流程】【产品体验报告】

0. 产品经理课程路线图 产品基础阶段&#xff1a;核心目的是了解行业、掌握技能 1. 认识互联网行业 1.1. 传统行业 vs 互联网行业 1.2. 互联网行业概念 1.3. 小结 2. 认识产品经理 2.1. 不同场景下的产品经理的职责差异 公司团队、领导对产品经理的期望不同&#xff0c;做的…

交叉编译的概念及交叉编译工具的安装

目录 一.什么是交叉编译 二.为什么要交叉编译&#xff1f; 三.交叉编译链的安装 四.相关使用方法 五.软连接 一.什么是交叉编译 交叉编译是指将一种编程语言编写的程序编译成另一种编程语言的程序&#xff0c;通常是在不同的操作系统或硬件环境中使用的。这种编译过程会产…

【手写 Vuex 源码】第十一篇 - Vuex 插件的开发

一&#xff0c;前言 上一篇&#xff0c;主要介绍了 Vuex-namespaced 命名空间的实现&#xff0c;主要涉及以下几个点&#xff1a; 命名空间的介绍和使用&#xff1b;命名空间的逻辑分析与代码实现&#xff1b;命名空间核心流程梳理&#xff1b; 本篇&#xff0c;继续介绍 Vu…

GWAS:mtag (Multi-Trait Analysis of GWAS) 分析

mtag (Multi-Trait Analysis of GWAS)作用&#xff1a;通过对多个表型相似的GWAS summary结果进行联合分析&#xff0c;发现更多的表型相关基因座。 以抑郁症状、神经质和主观幸福感这三个表型为例&#xff0c;分别对他们进行GWAS分析&#xff0c;鉴定得到32、9 和 13个基因座与…

前端食堂技术周刊第 70 期:Volar 的新开端、Lighthouse 10、良好的组件设计、React 纪录片、2022 大前端总结

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;黑巧克力 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 Volar 的新开端Chrome 110 的新功能Lighthouse 10Nuxt v3.2.0加速 JavaSc…

【github】解决超限制文件上传失败问题

之前因为push的一堆文件中有个104MB的大文件在里面&#xff0c;导致push一直失败一直失败超时又报错 一开始我还以为是VPN的问题&#xff0c;搞了好久都没解决 后来一步一步回撤发现是因为卡在了我那个104MB的文件这里 查阅了github的官方文档 关于 GitHub 上的大文件 - Git…

【计算机网络期末复习】第五章 传输层

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为想复习学校计算机网络课程的同学提供重点大纲&#xff0c;帮助大家渡过期末考~ &#x1f4da;专栏地址&#xff1a; ❤️如果有收获的话&#xff0c;欢迎点…

运动蓝牙耳机怎么选、最适合运动的蓝牙耳机推荐

很多人喜欢跑步时听歌来放松心情起到解压效果。但一般的无线蓝牙耳机很容易脱落丢失&#xff0c;甚至因为防水效果太菜导致耳机进水&#xff0c;很容易就损坏耳机了&#xff0c;加上运动出汗给耳腔带来的黏腻感与长期佩戴引发的疼痛感&#xff0c;这时一款好的运动设备就显得尤…