柯里化

柯里化是一个函数式编程中经常使用到的名词,它是指将一个可以接受多个参数的函数转变成一个仅接受一个参数,但返回一系列可以接受余下参数并返回结果的新函数的技术。简而言之,如果可以接受多个参数的函数中,其中的一个参数被固定了,那么就可以得到一个只需要接受余下参数的函数。

例如对于函数\( f(x, y) = y^x \),如果其中的\( y \)可以被固定为\( y = 2 \),那么就可以得到一个新函数\( g(x) = f(x, 2) = 2^{x} \)。此时原来的函数\( f(x, y) \)就被柯里化成更加简单的函数\( g(x) \)了。如果一个函数可以接受更多的参数,那么这个函数在柯里化之后,就会形成一系列的函数。

但是对于Immer库中的produce函数来说,柯里化可以允许对producer函数进行柯里化,通过固定一些参数来通过调用produce函数生成新的函数来简化对象状态的修改。

例如在以下的示例中,produce函数就被用一个柯里化的producer包装了起来。

import produce from 'immer';

const toggleTodo = (state, id) =>
  produce(state, draft => {
    // 从一个Draft对象查找获得的对象依旧是一个Draft对象。
    // 对这个新获取到的对象进行修改,依旧可以将变更应用到原始的数据状态上。
    const todo = draft.find(t => todo.id === id);
    todo.completed = !todo.completed;
  });

// 上面这个柯里化后的toggleTodo函数可以像下面一样使用。
const newTodos = toggleTodo(todos, 1);