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