函数式编程中元组的简单运用
引子
说到元组的话,可能不少小伙伴首先想到的是TypeScript中的元组类型。
在TypeScript中,元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
let x: [string, number];
x = ['Hello World', 1];
而我们这里要说的元组会更加的广义一些,具体是什么我们可以一步步的来走进它。
缘起
大家在使用函数过程中,势必会用到参数。不知道有没有小伙伴发现过这样一个问题,函数的复杂性往往跟函数的参数数量成正比,参数越多的函数,内部越复杂,使用起来愈发的不方便。
比方说,一个判断字符串数据类型的函数和一个http请求函数的比较:
// 判断字符串数据
function isString (value) {
return typeof value === 'string';
}
// 发送http请求
function sendRequest(method, url, data) {
...
}
对比起来,判断字符串数据类型的函数相对来说很容易使用,只存在一个参数,而http请求相对难以使用,因为参数相对较多一些。
开局
只有具有单一参数的纯函数是最理想的函数,也是最容易使用的,因为这种函数实现的功能非常单一,而且它的返回结果只依赖于入参。因此,我们应该尽可能的使用纯函数来进行开发,来确定函数更加灵活和通用,从而将业务进行解耦。但是,在真实的业务开发过程中,想要使用纯函数来实现业务功能还是很具有挑战性的。
那如何在函数返回结果的时候额外添加一个状态呢?
比方说,使用过Element UI的小伙伴,在使用Form表单的validate方法的时候,返回的就是(boolean, object)。
通过类比,我们可以使用元组来作为返回值,将结果和状态作为一个元组来返回。
下面我们还是以isString方法为例来展示一下为代码:
function isString (vlaue) {
...
reutrn [boolen, errMsg];
}
元组到底是什么呢?
元组是有限的、有许多元素的集合,通常来说由N个有限的值组成。
升级
使用元组有什么好处呢?
- 可以有效的减少函数参数
- 避免数据污染,且不可变更
下面我们以元组为例来实现一个表单的非空校验代码
const trim = value => value.trim();
const isNotNull = value => {
if (!vlaue) {
reutrn [false, 'Illegal input. Expected non-empty value.'];
}
return [true, 'Effective value.'];
}
大结局
通过上面的例子可以看出来,元组是减少函数的参数数量的有效方法之一。另外,像是函数柯里化也是一种行之有效的方法,后续我们会深入的聊一下柯里化相关的内容。
欢迎大家在下方留言讨论交流。
转载自:https://juejin.cn/post/7150664375995465759