函数组合

纯函数和柯里化很容易写出洋葱代码 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'))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 纯函数和柯里化很容易写出层层包含的洋葱代码(h(g(f(x)))) 函数组合可以让我们把细粒度的函数重新组合成一个...
    翔子丶阅读 1,144评论 0 0
  • 1. 函数组合可以让我们把细粒度的函数重新组合生成一个新的函数 2. lodash中的函数组合 函数组合 (c...
    浅忆_0810阅读 3,671评论 0 1
  • 通过arr[0]拿到end 简单的需求复杂的写法 探索函数组合 函数1:定义header 输入一个数组 返回数组的...
    Upcccz阅读 5,036评论 0 1
  • 需求 我们需要写一个函数,输入 'kevin',返回 'HELLO, KEVIN'。 尝试 还好我们只有两个步骤,...
    Vicky丶Amor阅读 1,508评论 0 3
  • 组合函数就像堆乐高积木一样,将不同的组件按照不同的方式拼成一个有用的组件。 一.输出到输入 上一章我们已经看到过一...
    JamesSawyer阅读 2,682评论 0 0