函数式编程之柯里化运用
前情回顾
在上一篇文章里面,我们介绍了如何减少函数参数的方法之一——元组。元组虽然对于减少函数参数,提升函数使用十分有效,但是实际业务开发过程中,无法完全的使用元组来解决问题。这里我们一起来聊一下另外一种行之有效的方法——柯里化。
在介绍元组的时候,我们介绍多参数的函数的时候,提到了函数的复杂性与参数的数量成正比。函数柯里化主要将函数由多参数转化为单一参数,极大程度的提升了函数的易用性。
成员介绍
一元函数是指函数方程式中只包含一个自变量。
柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
在日常开发过程中,我们经常会使用到各种数据类型的判断,相信大家对于数据类型的判断已经很熟悉了。那么,下面我们以判断数据类型函数为例子展开表演。
小试牛刀
数据类型判断的方式主要有一下几种:
- typeof
- instnaceof
- Object.prototype.toString
在实际业务开发过程中,大家碰到进行数据类型判断的时候,大多数时候直接进行函数判断了;当碰到一些相对复杂或者使用高频的场景的时候,会将数据类型判断的函数放到一个模块中统一管理。
比方说,我们要判断一个函数是否是普通的对象类型,而不是数组或者其它类型,这时候我们可能会这样实现:
function isPlainObject (value) {
return Object.prototype.toString.call(value) === '[object Object]';
}
如果我们还有一个高频场景要判断数据是否是Date类型,那么我们可能又会添加如下代码:
function isDate (value) {
return Object.prototype.toString.call(value) === '[object Date]';
}
登堂入室
碰到多个这样的高频场景的时候,有经验的程序员可能就开始考虑合并提取了。我们这里就装一下资深程序员,对上面的代码进行提取封装。
function validateDataType (value, type) {
return Object.prototype.toString.call(value) === type;
}
这个时候我们就可以使用 validateDataType 函数,传入要判断的数据类型和数据类型的值进行各种数据类型的判断了。
有一个特殊的点我们需要注意:在缺少参数的情况下,调用validateDataType函数会导致缺失参数的值变为undefined。也正是由于Javascript支持在缺少函数的情况下对函数进行调用,这可能是JavaScript无法原生支持柯里化的原因吧。
对用函数使用者来说,同样面临着一个重要的问题,那就是:需要准确的了解每个数据类型对应的值。相对来说数据类型的值因为使用高频,所以相对来说还好,但是,如果实际业务中的更复杂的场景下,就很难记住所有的参数了。
鉴于上述两项重要原因我们就需要使用柯里化来解决问题,既可以解决掉缺少参数的情况,也可以简化函数的使用,可谓是一举两得。
登峰造极
接下来我们就用柯里化的思想对上述函数进一步处理,虽然实际上柯里化并不是更好的处理方式。
function isPlainObject (type) {
return function (value) {
return Object.prototype.toString.call(value) === type;
}
}
function isDate (type) {
return function validateDataType (value) {
return Object.prototype.toString.call(value) === type;
}
}
经过柯里化处理之后,使用者还是只需要调用对应的数据类型判断方法就可以了,而且只需要传入要判断的数据类型就可以了。
以上方法表明:柯里化只是利用了闭包,将多参数函数拆解成多个单参数调用。
落幕
好了,有关函数柯里化的内容我们就聊到这里了,希望对大家有所帮助,如果有不足的地方欢迎大家指正。
欢迎大家在下方留言交流讨论。
转载自:https://juejin.cn/post/7151032664286478372