浅聊组合函数

简介: 经历过一些列的函数式编程思想的学习总结,一些重要的高阶函数的学习,以及前一段时间关于 RxJS 的学习。

image.png

经历过一些列的函数式编程思想的学习总结,一些重要的高阶函数的学习,以及前一段时间关于 RxJS 的学习。


我们再回看一次 —— 组合函数 compose


本瓜越来越觉得,【易读】的代码应该是将声明和调用分开来的。根据不同的流程,用函数组合的方式、也可以说它是管道、或者说是链式调用,将声明的函数组合起来,再等待时机进行调用。


如果没有组合函数 compose,函数连续调用将会是嵌套的:


const multi10 = function(x) { return x * 10; }
const toStr = function(x) { return `${x}`; }
const compute = function(x){ 
    return toStr(multi10(x))
}
compute(8)


fn3(fn2(fn1(fn0(x)))),层层嵌套是很容易看错的;

所以,必须尝试将调用层级扁平化!

compose 应运而生,它大概就会是这样:


const compose = function(f,g) { 
    return function(x) { 
        return f(g(x))
    }
}
let compute = compose(toStr, multi10)
compute(8)


通过使用compose函数我们可以把两个函数组合成一个函数,这让代码从右往左执行,而不是层层计算某个函数的结果作为另一个函数的参数,这样代码也更加直观。

当然,我们不能让 compose 限制于只能处理连续调用两个函数,于是支持任意参数版本的 compose 将是这样的:


function compose(...funs){ 
    return (x) =>funs.reduce((acc, fun) => fun(acc), x) 
}


通过函数组合,我们可以可以声明式地指定函数间的关系,代码的可读性也大大提高,也方便我们后续对代码进行扩展跟重构;


而且在React里面,当我们的高阶组件变多的时候,一个套着一个就很难看,我们就可以通过类似的方式来让我们的高阶组件层级扁平化;


这就是最最原始的 compose,以及它被提出的原始动机~~


相关文章
|
Java Linux 开发工具
怎样下载安装Eclipse并配置开发环境?
Eclipse是一款非常流行的Java开发工具,它本身是开源的,适合多种多样的开发场景,深受Java开发者们的喜爱。今天我就跟大家介绍一下如何下载安装Eclipse,以及如何配置Eclipse的开发环境。
359 0
|
Linux Shell 数据安全/隐私保护
超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置
超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置
1826 0
|
8月前
|
机器学习/深度学习 人工智能 搜索推荐
Second Me:硅基生命或成现实?如何用AI克隆自己,打造你的AI数字身份!
Second Me 是一个开源AI身份系统,允许用户创建完全私有的个性化AI代理,代表用户的真实自我,支持本地训练和部署,保护用户隐私和数据安全。
1217 8
Second Me:硅基生命或成现实?如何用AI克隆自己,打造你的AI数字身份!
【PCB设计秘籍】AutoDesk Eagle轻松驾驭:LMC555CN/NOPB器件库下载与添加全攻略,设计效率飙升!
【8月更文挑战第2天】【PCB设计】AutoDesk Eagle如何下载和添加LMC555CN或LMC555CN/NOPB器件的库
424 11
|
9月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
465 0
|
图形学 Android开发 开发者
U3D游戏开发实战:有效策略缩小包体大小,提升加载速度
【7月更文第12天】随着移动设备的普及,Unity 3D(简称U3D)作为一款强大的跨平台游戏开发引擎,成为了众多独立开发者和游戏工作室的首选。然而,面对日益增长的用户需求与有限的设备存储空间,如何在保证游戏质量的同时,有效缩减游戏包体大小,成为了开发者面临的一大挑战。本文将探讨一系列实用技巧和最佳实践,帮助你在U3D开发小游戏时显著减小包体尺寸,从而提升玩家的下载体验与启动速度。
498 12
|
监控 项目管理
PMP项目变更管理及变更流程总结
PMP项目变更管理及变更流程总结
820 0
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
320 2
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十七):【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
在uni-app中,使用axios实现网络请求和登录功能涉及以下几个关键步骤: 1. **安装axios和axios-auth-refresh**: 在项目的`package.json`中添加axios和axios-auth-refresh依赖,可以通过HBuilderX的终端窗口运行`yarn add axios axios-auth-refresh`命令来安装。 2. **配置自定义常量**: 创建`project.config.js`文件,配置全局常量,如API基础URL、TenantId、APP_CLIENT_ID和APP_CLIENT_SECRET等。
853 60
|
Web App开发 人工智能 供应链
金蝶云星空管理中心反序列化命令执行漏洞(RCE)
​金蝶云星空管理中心存在反序列化命令执行,攻击者可通过该漏洞获取敏感信息,进而接管服务器。
1162 2