纯函数和柯里化很容易写出洋葱代码 h(g(f(x)))
数组中最后一个字符大写 .toUpper(.first(_.reverse(array)))
函数组合避免洋葱代码的产生
把细颗粒度的函数重新组合生成一个新的函数
函数组合(compose):一个函数要经过多个函数处理才能得到最终致,这个时候把中间过程的函数合并成一个函数。
函数组合默认从右向左执行
function compose(f, g) {
return function(value) {
return f(g(value))
}
}
function reverse(array) {
return array.reverse(array)
}
function first(array) {
return array[0]
}
let last = compose(first, reverse)
console.log(last([1,2,3]))
lodash中的函数组合
flow() flowRight() 可以组合多个函数
flow()从左到右
flowRight()从右向左
实现flowRight
function compose (...args) { //剩余参数
return function (value) {
return args.reverse().reduce(function(acc, fn) {
return fn(acc)
}, value)
}
}
const compose = (...args) => value => args.reverse().reduce((acc, fn) => fn(acc), value)
函数组合满足结合律
如何调试组合函数
NEVER SAY DIE ---> never say die
const _ = require('lodash')
// 辅助函数
const log = v => {
console.log(v)
return v
}
const trace = _.curry((tag, v) => {
console.log(tag, v)
return v
})
const split = _.curry((sep, str) => _.split(str, sep))
const join = _.curry((sep, array) => _.join(array, sep))
const map = _.curry((fn, array) => _.map(array, fn))
const f = _.flowRight(join('-'), map(_.toLower), log, split(' '))
const f = _.flowRight(join('-'), trace('map之后'), map(_.toLower), trace('split之后'), split(' '))
console.log(f('NEVER SAY DIE'))