深入理解函数式编程:一等公民的函数、纯函数与柯里化

前言

最近在复习JavaScript中的知识点,其中有个重要内容是:函数式编程。其中有三个重要的概念:一等公民的函数、纯函数和柯里化。

通过这篇文章和大家一起探讨这三个概念,并通过代码示例来加深理解。

PS:文章用的JavaScript编写代码示范。


一、一等公民的函数

在函数式编程中,函数被视为一等公民。这意味着函数可以像其他数据类型一样,被赋值给变量、作为参数传递给其他函数,甚至作为函数的返回值。这种特性赋予了函数极大的灵活性和表现力。

1、代码示范

// 将函数赋值给变量
function greet(name) {
    return `Hello, ${name}!`;
}
let greetFunc = greet;
console.log(greetFunc("Alice"));  

// 函数作为参数传递
function applyFunction(func, arg) {
    return func(arg);
}
let result = applyFunction(greet, "Bob");
console.log(result);  

// 函数作为返回值
function getGreetingFunction() {
    function innerGreet(name) {
        return `Hi, ${name}!`;
    }
    return innerGreet;
}
let innerGreetFunc = getGreetingFunction();
console.log(innerGreetFunc("Charlie"));  

2、运行结果

 

二、纯函数

纯函数是函数式编程的另一个重要概念。一个函数如果满足以下两个条件,就被称为纯函数:

  • 相同的输入总是返回相同的输出。
  • 没有副作用,即不修改外部状态,不产生可观察的变化(如 I/O 操作、修改全局变量等)。

1、代码示范

// 纯函数示例
function add(a, b) {
    return a + b;
}

// 非纯函数示例,因为它修改了外部状态
let count = 0;
function increment() {
    count++;
    return count;
}

2、代码分析

function add(a, b) {
    return a + b;
}
  • 输入输出特性:这个函数接受两个参数ab,无论何时调用这个函数,只要传入相同的ab值,就一定会返回相同的结果。例如,add(2, 3)永远会返回5 。
  • 无副作用:函数内部只是进行了加法运算并返回结果,没有修改任何外部的变量或状态,也没有进行任何如 I/O 操作等可能产生可观察外部变化的行为。

三、柯里化

柯里化是一种将多参数函数转换为一系列单参数函数的技术。通过柯里化,我们可以将一个函数的参数逐步传递,而不是一次性传递所有参数。

1、代码示范 

// 普通函数
function addNumbers(a, b, c) {
    return a + b + c;
}

//普通的 JavaScript 函数,接受三个参数a、b和c,返回它们的和。它需要一次性传入所有参数才能得到最终结果。

// 柯里化函数
function curryAdd(a) {
    return function(b) {
        return function(c) {
            return a + b + c;
        }
    }
}
//curryAdd函数接受一个参数a。
//它返回一个内部函数,这个内部函数又接受一个参数b。
//这个内部函数又返回一个内部函数,这个最内层的函数接受参数c。
//最内层函数返回a + b + c,这里的a和b是来自外层函数的参数,这种机制利用了 JavaScript 的闭包特性,使得外层函数的参数在内部函数中依然可用。

let curriedAdd = curryAdd(1);
let curriedAdd2 = curriedAdd(2);
let result = curriedAdd2(3);
console.log(result); 

2、运行结果

  • curryAdd(1)执行后,返回一个新的函数,这个新函数记住了a的值为 1,此时curriedAdd就相当于一个只接受参数b的函数。
  • curriedAdd(2)执行后,又返回一个新的函数,这个新函数记住了a为 1,b为 2,此时curriedAdd2就相当于一个只接受参数c的函数。
  • 最后curriedAdd2(3)执行,传入参数c为 3,最终计算并返回1 + 2 + 3的结果,即 6。

四、小结

 本篇文章主要介绍了函数式编程的三个概念:一等公民的函数、纯函数和柯里化,但函数式编程还有其他重要的概念如:高阶函数、不可变数据、递归、函数组合。有兴趣的朋友可以先自行了解,后续我再找时间进行更新其他的核心概念。

如果你喜欢这篇文章,欢迎评论、点赞、收藏~

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十八朵郁金香

感恩前行路上有你相伴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值