likes
comments
collection
share

函数式编程中元组的简单运用

作者站长头像
站长
· 阅读数 11

引子

说到元组的话,可能不少小伙伴首先想到的是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.'];
}

大结局

通过上面的例子可以看出来,元组是减少函数的参数数量的有效方法之一。另外,像是函数柯里化也是一种行之有效的方法,后续我们会深入的聊一下柯里化相关的内容。

欢迎大家在下方留言讨论交流。