函数组合(Function Composition)

ES5版本的compose

看下面一段代码,这段代码被称为组合 compose

const compose = function(f, g) {
  return function(x) {
    return f(g(x));
  };
 };

ES6版本的compose

由于函数式编程大行其道,所以现在将会在 JavaScript 代码看到大量的箭头()=>()=>()=>的代码。

ES6 版本 compose

const compose = (f, g) => x => f(g(x));

这段代码定义了一个名为 compose 的函数,它接受两个函数作为参数 f 和 g,并返回一个新的函数。这个返回的函数接受一个参数 x,首先将 x 应用到函数 g 上,然后将 g 的结果应用到函数 f 上。这是函数式编程中的一个常见模式,称为函数组合(Function Composition)。
函数组合允许你将多个函数组合成一个单一的函数,这样可以将复杂的操作分解成更小、更易于管理的部分。这样做的可读性远远高于嵌套一大堆的函数调用。在这个例子中,compose 函数允许你将两个函数 f 和 g 组合成一个新的函数,这个新的函数会先执行 g,然后将 g的结果作为输入传递给 f。

举个例子

假设我们有两个简单的函数:

const addOne = x => x + 1;
const double = x => x * 2;

我们可以使用 compose 函数将它们组合起来:

const compose = (f, g) => x => f(g(x));

const addOneThenDouble = compose(double, addOne);

现在,addOneThenDouble 是一个新的函数,当你传递一个值给它时,它会首先将这个值加一,然后将结果翻倍。例如:

console.log(addOneThenDouble(3)); // 输出:8

这里,3 首先被传递给 addOne 函数,得到 4,然后 4 被传递给 double 函数,得到最终结果 8。

升级版 compose

但是我们这个这个compose不够完善,只能处理两个函数参数。redux源码有个很完备的compose函数,我们借鉴一下。

function compose(...funcs){
  if (funcs.length === 0){
    // 判断有没有传入处理函数,如果没有,直接把参数返回出去
    return arg => arg
  }
  
  if (funcs.length === 1 ){
    // 如果只传入一个处理函数,那么执行传入的第一个函数
    return funcs[0]
  }
    // 如果传入多个执行函数,那么使用reduce函数依次执行
    return funcs.reduce((a,b)=>(...args) => a(b(...args)))
}

有了这个函数,我们可以随意组合无数个函数。现在我们增加需求,组合出一个addOneThenDoubleThenaAdTwo函数,内容是把传入的参数先+1,然后翻倍,最后 +2 输出结果

 const addOne = x => x + 1;
 const addTwo = x => x + 2;
 const double = x => x * 2;
 const addOneThenDoubleThenaAdTwo = compose(addTwo,double,addOne);
 console.log(addOneThenDouble(3)); // 10

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AXS2003B 爱协生 2.4W单通道 AB类音频功率放大器 兼容LM4890 低成本

AXS2003B 是一颗单通道AB类音频功率放大器。在5V电源供电,THDN10%,4欧姆负载上可以输出2.4W 的功率。 AXS2003B优异的噪声和THD指标可以提供高品质的音频信号放大。极少的外围元件就能提供芯片稳定工作,大大减少了PCB面积并降低成本。 AXS20…

SSL证书一年多少钱?有便宜的吗?

SSL安全证书的价格因其类型、品牌、验证级别、附加功能(如多域名支持、通配符功能等)以及购买时长(通常以年为单位)的不同而有所差异。以下是大致的价格范围: 永久免费SSL证书_永久免费https证书_永久免费ssl证书申请…

广告买量的数据驱动策略:从归因到精准投放

在广告买量场景下,数据驱动一定是有意义的。对中小型企业和产品而言,起量和精准是重点,毕竟他们更关注ROI(短期利润),这也是效果广告专注中小型企业的原因。而大企业的核心是把流量合理导入自身构建的生态中…

哲学家带你深♂入了解文件操作

目录 一、文件指针 二、文件的打开与关闭 三、顺序读写函数的介绍 四、文件的随机读写 1、fseek 2、ftell 3、rewind 总结 前言 c语言中的文件操作虽然不怎么常用但也是非常重要的知识,今天由本哲学家带大家深♂入了解c语言文件操作。 一、文件指针 每个被使用的文…

Day24:回溯法 LeedCode 77.组合

回溯法解决的问题都可以抽象为树形结构 for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。 从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把…

virtualbox 日常运维

前言 虽然平常以macOS和Linux作为主打工作环境,但还是有很多需要用到windows的时候,如camtasia和券商QMT软件。 在二手ThinkPad P53上安装了几个windows虚机,作为测试环境。Mac笔记本远程桌面连接嫌麻烦,还是命令行舒服。MacOS自…

SAP gui 组服务器 提示 Error service sapmsPRD unknown

/etc/hosts 追加IP地址和域名的配对关系 /etc/services 追加 sapms[sid] 3601/tcp

java 抠取红色印章(透明背景)

一个亲戚让我帮他把照片里的红色印章抠出来,,,记录下处理过程,代码如下,可直接用: public static void signatureProcess(String sourceImagePath, String targetImagePath) {Graphics2D graphics2D null…

2015年认证杯SPSSPRO杯数学建模B题(第二阶段)替换式密码全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 B题 替换式密码 原题再现: 历史上有许多密码的编制方法。较为简单的是替换式密码,也就是将文中出现的字符一对一地替换成其它的符号。对拼音文字而言,最简单的形式是单字母替换加密,也就是以每个…

Nodejs 16与 gitbook搭建属于你自己的书本网站-第一篇

最近想重新搭建一个网站来存放自己的相关知识点,并向网络公开,有个hexo博客其实也不错的,但是总感觉hexo很多花里胡哨的玩意,导致挂载的博客异常卡,这样反而不利于我自己回顾博客了,于是我就开始钻研这个鬼…

Android逆向-数据修改逻辑修改视图修改

目录 0x00 相关工具及环境 0x01 APP逆向 - 数据修改 0x02 APP逆向 - 逻辑修改 0x03 APP逆向 - 视图修改 希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 个人博客链接:CH4SER的个人BLOG – Welcome To Ch4sers B…

Git Fork后的仓库内容和原仓库保持一致

Git Fork后的仓库内容和原仓库保持一致 ①Fork原仓库内容到自己仓库 ②将项目内容下载到本地 ③使用git命令获取原仓库内容,将原仓库的最新内容合并到自己的分支上并推送 下面从第三步开始演示~ 这里以码云上的若依项目为演示项目 ③使用git命令获取原仓库内容 …

什么裤型的裤子最百搭?男生比较好看的裤子品牌分享

很多男生每隔一段都会选择一些新的裤子,但是现在市面上的裤子种类和风格太多,并且有不少材质劣质、细节设计差的品牌混杂在其中,大家一不小心就选到质量不好的裤子。 所以如何选择到合适、质量好的裤子确实是一个让人头疼的问题,…

AcWing 4609:火柴棍数字 ← 贪心算法

【题目来源】 https://www.acwing.com/problem/content/4612/【题目描述】 给定 n 个火柴棍,你可以用它们摆出数字 0∼9。 摆出每个数字所需要的具体火柴棍数量如下图所示: 请你用这些火柴棍摆成若干个数字,并把这些数字排成一排组成一个整数…

Netty学习——源码篇5 EventLoop 备份

1 Reactor线程模型 Reactor线程模型 中对Reactor的三种线程模型——单线程模型、多线程模型、主从多线程模型做了介绍,这里具体分析Reactor在Netty中的应用。 1.1单线程模型 单线程模型处理流程如下图: 单线程模型,即Accept的处理和Handler…

(科研篇)如何做科研

1.科研周期: 2.CCF列表 1.搜索论文(顶会) 2.谷歌学术检索 3.如何阅读文献 最重要的部分是abstract introduction 和related work,要明白某个东西的历史,从而进一步发现的缺陷,然后通过实现实验去证明。 通…

HubSpot出海CRM的团队协作与流程优化

在数字化营销日益盛行的今天,团队协作与流程优化已成为企业获取竞争优势的关键因素。HubSpot出海CRM不仅提供了强大的客户管理工具,更在团队协作与流程优化方面展现出卓越的能力。 一、团队协作在营销中的重要性 团队协作在营销中的重要性不言而喻。一…

光伏智慧管理平台:全周期全流程光伏业务管理

随着光伏技术的快速发展和光伏电站规模的不断扩大,光伏业务的管理变得越来越复杂。为了提高管理效率、降低运营成本并提升光伏电站的运行效益,光伏智慧管理平台应运而生。本文将重点介绍光伏智慧管理平台的功能及其在全周期全流程光伏业务管理中的应用。…

最长有效括号(C语言)

题目链接:. - 力扣(LeetCode) 这道题,我看了一种解法,觉得很好,来分享一下 这道题主要是 思考 当前 ) 与之匹配 ( 在哪里 ,记录下来,最后比较最大值 例子: 第…

浅谈 kafka

引言 同事在公司内部分享了关于 kafka 技术一些相关的内容,所以有了这篇文章;部分图片选自网络摘抄; 1 Kafka概述 1.1 定义 Kafka传统定义:kafka是一个分布式的基于发布/订阅模式的消息队列。 Kafka最新定义:kafka…
最新文章