为什么compose是函数编程不可缺少的组件?

大家好这里是梦兽编程,一份分享编程经验和编程思路的UP主。UP主会经常在网上分享一些编程思路和解决方案。有些思路可能是你花几千块去培训也不一定有,如果感兴趣的话可以关注梦兽编程。

为什么compose组合是函数编程不可缺少的内容?

这次的分享我们不需要与面向对象的设计模式进行对比了,因为compose是函数式编程的一个重要标记。面向对象一般用不上。

在之前的分享中我们都知道函数范式与面向对象范式编程最主要的区别是,函数式编程是以函数作为第一公民。所以很多时候我们的代码可能会出现以下的编码。

比如我们现在有三个函数,我们有一个场景需要对一个数字进行先加+1,后*3,再减去1

javascript 复制代码
function addNumOne(value: number) {
  return value + 1;
}

function addSubOne(value: number) {
  return value + 2;
}

function addMultTree(value: number) {
  return value * 3;
}

这个时候你会如何编码呢?我们很容易就会写出下面的代码。

ini 复制代码
const sum = addSubOne(addMultTree(addNumOne(2)))

如果你是一位阿拉伯人看到这种编码方式应该是非常容易理解的,但很多的语言是喜欢从左往右进行阅读。还有一个比较重要的问题是你会发现以上的写法你是无法把上面的"组合"进行复用的。

如果你愿意的话可以再 c v 一下变成也不是不可以的,因为函数范式的不可变性,你cv后也不会改变输出的结果。

ini 复制代码
const sum = addSubOne(addMultTree(addNumOne(3)))

我们要如何解决这一类问题

复用性

我们先要解决复用性的问题,解决复用性的问题也很好理解我们只要再拿一个函数进行hoc就好了。比如:

ini 复制代码
const addAfterMultAfterOne = (value: number) => {
  return addSubOne(addMultTree(addNumOne(value)));
};

从左往右的阅读体验 - compose

微信图片_20230726152652.png

可以看出我们只需要做一个pipe就好了。其实中间件的处理逻辑和今天说的柯里化差不多。 我们可以看到我们的每次pipe的结果都依赖上一次的结果。所以只需要那一个数组存起来然后进行反转,把上一次的结果给到下一个函数即可。

ps: 当然柯里化的用途很广,我只是用来处理这种场景比较多。还有其他用途但用得比较少所以就没分享了,请大家跳出被动式思维,主动去思考。

先写一个简单的函数

typescript 复制代码
const compose = (...fns) => {
  // 返回一个输入数据源函数 - 也是下次分享的重要概念柯里化
  return (value: number) => {
    return fns.reduce((y, f) => f(y), value);
  };
};

如何使用

ini 复制代码
const addAfterMultAfterOne = compose(addNumOne, addMultTree, addSubOne);
console.log(addAfterMultAfterOne(2));

一个思考的问题

我们可以发现这里的addNumOne我们一件写死了+1如果我们下次还需要进行加法的操作的时候,会发现做了重复工作。我们要如何解决呢?这是下次要分享的内容。

javascript 复制代码
function addNumOne(value: number) {
  return value + 1;
}

以上就是本期的所有内容,如果对你的学习和生活有什么帮助,请一定要给up主一个一件三连。你的三连是我创作的最大动力,如果你还没关注up主的可以关注一下,下次回来将会分享柯里化的作用。

本文使用 markdown.com.cn 排版

相关推荐
Setsuna_F_Seiei6 小时前
前端的 AI 学习之路 01 之 Agent API 调用 - 和 Agent 的基础对话
前端·人工智能·ai编程
threerocks6 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
徐小夕7 小时前
3分钟从想法到Agent上线:我们开源了一款AI可视化工作流“IDE”
前端·算法·github
why技术8 小时前
eli5,我觉得这个全网在吹的技能,使用体验真的很一般啊。
前端·人工智能·后端
excel8 小时前
记录升级 nuxt3 到 nuxt4 记录
前端
剑胆琴心静水深流9 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
前端snow9 小时前
ai agent -- Memory汇总
前端
ITresearchGuest10 小时前
AI 焦虑下,前端该何去何从
前端·人工智能
Codiggerworld10 小时前
Chrome DevTools 隐藏神技:这 5 个调试技巧你可能从来没用过
前端·chrome·chrome devtools
旋生万物10 小时前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf