Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Redux减速器称为减速器?_Javascript_Reactjs_Redux_Functional Programming - Fatal编程技术网

Javascript 为什么Redux减速器称为减速器?

Javascript 为什么Redux减速器称为减速器?,javascript,reactjs,redux,functional-programming,Javascript,Reactjs,Redux,Functional Programming,在学习Redux的过程中,我遇到了reducer。文件规定: reducer是一个纯函数,它接受前一个状态和一个操作,并返回下一个状态。(previousState,action)=>newState。它之所以称为reducer,是因为它是传递给Array.prototype.reduce(reducer,?initialValue)的函数类型 MDN将reduce方法描述为: reduce()方法对累加器和数组的每个值(从左到右)应用一个函数,将其减少为单个值 我仍然不明白为什么Redux定义

在学习
Redux
的过程中,我遇到了
reducer
。文件规定:

reducer是一个纯函数,它接受前一个状态和一个操作,并返回下一个状态。(previousState,action)=>newState。它之所以称为reducer,是因为它是传递给Array.prototype.reduce(reducer,?initialValue)的函数类型

MDN将
reduce
方法描述为:

reduce()方法对累加器和数组的每个值(从左到右)应用一个函数,将其减少为单个值

我仍然不明白为什么Redux定义了减速器,因为它毫无意义。其次,MDN描述似乎也不正确。
reduce
方法并不总是用于将值缩减为单个值。它可以用来代替
map
filter
,而且在代替链接时实际上速度更快

MDN描述是否不正确

跳回Redux减速器的定义,它指出:

它之所以称为reducer,是因为它是传递给Array.prototype.reduce(reducer,?initialValue)的函数类型

我的印象是Redux中的减速器负责修改状态。减速器示例:

const count = function(state, action) {
    if(action.type == 'INCREMENT') {
        return state + 1;
    } else if(action.type == 'DECREMENT') {
        return state - 1;
    } else {
        return state;
    }
}
。。。我看不出这是一个如何传递给
reduce
的函数。如何将该数据缩减为单个值?如果这是一个传递给
reduce
的函数,则
state
将是回调,
action
将是初始值

谢谢你的解释。很难概念化。

术语“reduce”实际上是函数式编程中使用的函数式术语。在Haskell、F#甚至JavaScript这样的语言中,我们定义了一个转换,该转换将集合(任何大小)作为输入,并返回单个值作为输出

所以(不要太迂腐,但我发现这有助于我)从视觉上思考它。我们有一个收藏:

[][][][][][][][][][]
…我们希望将其折叠为单个值:

N
在函数编程方面,我们可以使用一个函数来实现这一点,我们可以对集合的每个元素递归调用该函数。但如果你这样做,你需要在某个地方跟踪中间值,对吗?非纯实现可能会在函数外部保留某种“累加器”或变量来跟踪状态,如下所示:

var accumulator = 0;
var myArray = [1,2,3,4,5];

myArray.reduce(function (each) {
    accumulator += 0;
});

return accumulator;
但是,对于纯函数,我们不能这样做,因为根据定义,纯函数不能在其函数范围之外产生效果。与依赖于封装调用之间“状态”的外部变量不同,我们只需在方法中传递状态:

var myArray = [1,2,3,4,5];

return myArray.reduce(function (accumulator, each) {
    return accumulator + each;
}, 0);
在这种情况下,我们将函数称为“reducer”,因为它的方法签名。我们有
每个
(或
当前
-任何名称都可以),表示集合中的一个对象;和
state
(或
previous
),它被传递到函数的每个迭代,表示我们已经对集合中的先前元素进行的转换的结果


请注意,您引用的MDN文档是正确的;
reduce()
函数总是返回一个值。事实上,任何语言中的
reduce
方法都是一个接受“reducer”(具有上面定义的方法签名的函数)并返回单个值的函数。现在,是的,如果你调用的函数有副作用,你可以用它做其他事情,但你不应该。(本质上,不要将
.reduce()
用作foreach。)即使使用
reduce
调用的方法有副作用,reduce本身的返回值也将是单个值,而不是集合

最酷的是,这种模式不必像您在React中看到的那样只应用于数组或具体集合;这种模式也可以应用于流,因为它们是纯函数

希望这有帮助。值得一提的是,Redux站点上的定义可以改进(因为reducer的概念不仅仅是因为Javascript的数组原型方法)。你应该提交一份公关

编辑:维基百科上有一篇关于这个主题的文章。注意reduce有不同的名称,在函数式语言中,它通常被称为Fold

编辑(2020-10-03):人们似乎仍然觉得这很有用——这很好。随着时间的推移,我意识到“折叠”是一个更好的术语;函数式语言是正确的。“减速机”这个词其实并不坏,但也不一定是个好词

它之所以称为reducer,是因为它是传递给Array.prototype.reduce(reducer,?initialValue)的函数类型

这与您将传递给Array.reduce作为回调(reducer)的内容非常相似。重要的部分是:

callback
  Function to execute on each value in the array, taking four arguments:
    previousValue
      The value previously returned in the last invocation of the callback, or initialValue, if supplied. (See below.)
    currentValue
      The current element being processed in the array.
其中状态为“previousValue”,操作为“currentValue”

之所以称a为
减速机
,是因为您可以“减少”操作的
集合
和执行这些操作的
初始状态
(存储)以获得结果的
最终状态

怎么做?为了回答这个问题,让我再次定义减速器:

该方法将
功能(减速器)
应用于
累加器
和每个 数组的值(从左到右),以将其减少为单个 价值观

redux reducer做什么

减速器是一个纯
函数
,它接受当前状态和 操作,并返回下一个状态。请注意,当应用集合上的每个操作以更改此状态时,状态为累积状态

因此,给定动作的
集合
,减速器应用于集合的每个值(从左到右)。第一次,它返回
初始值
。现在,减速器再次应用于此初始状态和第一个
const count = function(state, action) {
    if (action.type == 'INCREMENT') {
        return state + 1;
    } else if (action.type == 'DECREMENT') {
        return state - 1;
    } else {
        return state;
    }
}
const arr = [1, 2, 3]
const sum = arr.reduce((accumulator, element) => {
  accumulator += element;
  return accumulator;
}); // sum equals 6 now
const sum = arr.reduce((accumulator, element) => {  // accumulator is the initial state
  accumulator += element; // we do something to modify the initial state
  return accumulator;  // we return that and it becomes the new state
});