• 【函数式编程】函数式编程、纯函数、高阶函数以及函数柯里化


    最近在学习React,看到了高阶函数以及函数柯里化等概念,因为对这些内容还比较生疏,于是查找了资料,发现都跟一个叫函数式编程的思想有关,于是搜集各方资料,稍微系统性地做了点自己的记录用于以后的复习。想要更系统性地学习可以翻阅这个文档:JS函数式编程指南,写得十分详细。

    函数式编程

    函数式编程是一种编程范式,它将计算过程视为一系列的函数调用。
    函数在函数式编程中被视为一等公民,这意味着函数可以作为参数传递,也可以作为返回值返回。这与我们在传统的过程式或面向对象编程中看到的明显不同,其中主要关注的是变量的状态变化和对象的行为。

    函数式编程与面向对象编程的对比

    面向对象编程(OOP)和函数式编程(FP)是当前最主流的两种编程范式。面向对象编程以对象作为基本单位,强调对象之间的交互和状态变化。而函数式编程以函数为基本单位,强调的是数据的映射关系,尽可能地避免状态变化。
    这两种编程范式各有优点,也有很多现代编程语言如Java、Python、JavaScript等都同时支持这两种编程范式。在实际的编程中,我们通常会结合使用这两种编程范式,根据问题的特性选择最适合的方法。

    纯函数

    纯函数是一种函数,其输出只由输入决定,并且在运行过程中不产生任何副作用。
    这里的副作用指的是函数对外部环境的任何改变,包括但不限于改变全局变量、修改输入参数、执行I/O操作等。
    例如,下面的JavaScript函数就是一个纯函数

    function add(x, y) {
        return x + y;
    }
    
    • 1
    • 2
    • 3

    纯函数有许多优点。首先,纯函数的行为是可预测的,因为给定相同的输入,纯函数总是返回相同的输出。其次,由于纯函数不产生副作用,它们不会改变程序的状态,这使得代码更容易理解和测试。

    高阶函数

    高阶函数是将函数用作参数或者返回值的函数
    高阶函数是函数式编程的核心,因为它们提供了一种强大的抽象机制,可以帮助我们编写更灵活和可重用的代码。
    例如,下面的JavaScript函数就是一个高阶函数:

    function greaterThan(n) {
        return m => m > n;
    }
    let greaterThan10 = greaterThan(10);
    console.log(greaterThan10(11));  // 输出:true
    
    • 1
    • 2
    • 3
    • 4
    • 5

    高阶函数的用途

    高阶函数的一个主要用途是创建可配置的函数。在上面的例子中,我们使用greaterThan函数创建了一个新的函数greaterThan10,这个新的函数可以检查一个数是否大于10。
    高阶函数也常常用于抽象出重复的代码。例如,我们可以创建一个高阶函数map,它接收一个函数和一个数组,然后应用这个函数到数组的每个元素:

    function map(func, array) {
        let result = [];
        for (let item of array) {
            result.push(func(item));
        }
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    高阶函数在许多函数式编程语言和库中都有广泛的应用。例如,在JavaScript的Array类中,许多方法(如map、filter和reduce)都是高阶函数。

    柯里化

    柯里化有两个特点:

    1. 柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c )。
    2. 柯里化不会调用函数。它只是对函数进行转换。
      示例:
    // 柯里化函数写法
    function add(x) {
      return function(y) {
        return x + y;
      };
    }
    
    // 调用柯里化函数
    const add5 = add(5);
    console.log(add5(3)); // 8
    console.log(add5(7)); // 12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    add() 函数被柯里化为两个函数:一个是接收一个参数 y 的函数,返回 x + y;另一个是接收两个参数 x 和 y 的函数,返回 x + y。

    优点

    • 函数更加灵活和可重用。通过柯里化,可以将一个多参数的函数转换为一系列单参数的函数,使函数更加灵活和可重用。
    • 可以避免重复的代码。通过柯里化,可以避免在调用函数时重复地传递参数,从而避免了重复的代码。

    缺点

    • 可能会降低性能。通过柯里化,函数的性能可能会降低,因为需要额外的内存来存储函数的返回值和参数。
    • 可能会增加代码复杂度。通过柯里化,可能会增加代码的复杂度,因为需要处理额外的参数和函数返回值。

    柯里化,不可变数据类型,纯函数等都是函数式编程中的概念。在React中这些概念很常见,因为React中很多涉及到函数式编程的概念。想要具体了解什么是函数式编程,可以查看JS函数式编程指南

  • 相关阅读:
    商城详情页的开发
    科目二倒车入库
    python:talib.BBANDS 画股价-布林线图
    优先级队列(堆)
    Java-io(输入/输出)
    多语言翻译软件 Mate Translate mac中文版特色功能
    怀孕也不算-《软件方法》自测题解析023
    Three.js 与 Python 语法 (PyWeb3D)
    学历不高,为何我还要转行编程?这个行业的秘密你知道吗?
    鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结
  • 原文地址:https://blog.csdn.net/fangyuan__/article/details/133385586