js 函数式编程(f)
我们来举一个简单事例来说明 reduce 是如何使用的,reduce 第一个参数就是我们接受数组 arrayOfNums ,第二个参数是一个函数,这个函数接受两个参数,memo 是用于记忆每一次操作后结果,i 为数组每一个元素,我们通过可以将 i 加入 memo 来事前求和,最后一个参数为 reduce 的初始值 0。


我们做肉汁 cookGravy 方法,可以先设定好烹饪的温度和时间参数,然后在调用 cookInPot 方法来根据设定进行烹饪肉汁。

这时我们可以用到 partial 这个偏函数,我们定义偏函数,偏函数是返回一个函数,将事先准备好的参数传递给返回函数。
先看一个简单偏函数, sum 是取和函数接受两个参数 a 和 b,如果我们函数是对输入加 2 呢,我们可以改造一下

如何恰当解释让您了解什么是偏函数,偏函数目的在于减少我们函数的参数,例如函数 funa 需要三个参数(a,b,c),我们可以用一个函数 funcurry 接受 a,b 两个参数然后返回函数接受参数 c。这样我们就可以减少 funa 的参数个数。从而我们解决了 cookStew 嵌套 cookInPot 这个函数,取而代之用 cookStewCurry 接受 _.partial 返回的函数,

我们同样创建其他的偏函数。


在 cookInPot 方法中,我们先执行 addIngredientsToPot 我们先将准备材料放置容器中进行烹调。这两个步骤是有一定先后顺序,请求前一个函数的执行结果作为后一个函数的参数被后一个函数所使用。

上面我们学习了偏函数,然后来学习 compose 将多个函数组合来使用,使用的方式先执行最右侧的函数执行结果作为左侧
在 underscore 的 compose 可以返回函数集 functions 组合后的复合函数, 也就是一个函数执行完之后把返回的结果再作为参数赋给下一个函数来执行. 以此类推. 在数学里, 把函数 f(), g(), 和 h() 组合起来可以得到复合函数 f(g(h()))。

