函数柯里化详解

一:函数柯里化介绍

在计算机科学中,柯里化 (Currying)是把接受多个参数的函数 变换成接受一个单一参数(最初函数的 第一个参数)的函数 ,并且返回接受余下的参数且返回结果的新函数的技术。

函数柯里化是一种函数式编程技术,它可以将一个接受多个参数的函数转换为一系列只接受单个参数的函数。这种技术的主要目的是为了简化函数的调用方式,同时也可以提高代码的可读性和可维护性。

在函数柯里化中,我们可以将一个接受多个参数的函数转换为一个只接受一个参数的函数,然后再返回一个新的函数,这个新的函数也只接受一个参数。这个过程可以一直进行下去,直到我们得到一个最终的函数,这个函数只接受一个参数,并且返回我们最终想要的结果。

二:手写函数柯里化

基础使用

设计思路

  • 定义接受一个参数的函数
  • 内部返回一个接受剩余参数的新函数,返回累加结果

书写代码

在下方代码中,我们定义了一个参数为 a 的 sum 函数,并且在这个函数里返回了另一个参数为b的函数。在新函数里,我们将 a 和 b 求和并返回结果。这就是函数柯里化。

javascript 复制代码
    <script>
        function sum(a){
            return function(b){
                return a+b
            }
        }
        const data = sum(1)(2)
        console.log(data);
    </script>

运行效果

经典面试题

设计思路:

  • 保存不定长参数
  • 是否达到长度
  • 累加5个参数
  • 返回函数

书写代码

html 复制代码
    <script>
        function sumMaker(length) {
            // 存储参数
            let nums = []
            function sum(...args) {
                nums.push(...args)
                if (nums.length >= length) {
                    // 长度到length
                    const res = nums.slice(0, length).reduce((p, v) => p + v, 0)
                    nums = []
                    return res
                } else {
                    // 长度没到length
                    return sum
                }
            }
            return sum
        }
        let sum = sumMaker(5)
        const data = sum(1, 2, 3)(4, 5, 6)
        console.log(data)
    </script>

运行效果

实际应用

函数柯里化常用于 参数的复用:为函数预制通用参数,供多次复用

html 复制代码
    <script>
        // 判断类型
        // 方法一
        // const typeOfType = function (type) {
        //     // 复用 类型判断的逻辑
        //     function isUndefined(thing){
        //         return typeof thing === type
        //     }
        //     return isUndefined
        // }

        // 简化写法
        const typeOfType = type => thing => typeof thing === type
        
        // typeOfType动态生成类型判断函数,
        const isString = typeOfType('string')
        console.log(isString(123));
        console.log(isString('haha'));
    </script>

三:总结

通过上述介绍,其实函数柯里化可以理解为一种编程思想,在真正的开发中这种纯函数柯里化的问题是很少遇到的,更多的是用来面试,所以各位小伙伴对这个定义以及写法有所掌握即可。好啦,本文到此结束啦,希望能够对你有所帮助哦!

相关推荐
Yhame.2 小时前
深入理解 Java 中的 ArrayList 和 List:泛型与动态数组
java·开发语言
mazo_command3 小时前
【MATLAB课设五子棋教程】(附源码)
开发语言·matlab
IT猿手4 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
青春男大4 小时前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse
88号技师4 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
Zer0_on4 小时前
数据结构栈和队列
c语言·开发语言·数据结构
一只小bit4 小时前
数据结构之栈,队列,树
c语言·开发语言·数据结构·c++
一个没有本领的人4 小时前
win11+matlab2021a配置C-COT
c语言·开发语言·matlab·目标跟踪
anyup_前端梦工厂4 小时前
初始 ShellJS:一个 Node.js 命令行工具集合
前端·javascript·node.js
5hand5 小时前
Element-ui的使用教程 基于HBuilder X
前端·javascript·vue.js·elementui