Pointfree

Point-free是一种编程风格,这是一种在函数里面实际上没有写任何东西的函数编写方式,这种方式可以将一个函数与其他函数一起生成一个新的函数。我们可以把数据处理的过程定义成与数据无关的合成运算,不需要用到代表数据的那个参数,只要把简单的运算步骤聚合成一起,在使用这种模式之前我们需要定义一些辅助的基本运算函数,下面这个就是Pointfree模式

  • 不需要指明处理的数据
  • 只需要合成运算过程
  • 需要定义一些辅助的基本运算函数
const f = fp.flowRight(fp.toLower, fp.join('-'), fp.split(' '))

函数式编程的核心就是把运算过程抽象成函数,而Pointfree模式就是把抽象出来的函数再合成成一个新的函数,这个合成有是一个抽象的过程,在抽象的过程中我们依然不需要关心数据, Point-free 模式来实现 AAA BBB ==> aaa-bbb

// point tree
const fp = require('lodash/fp')

const f = fp.flowRight(fp.replace(/\s+/g, '-'), fp.toLower)

console.log(f(['AAA    BBBB']))

可以看出来Pointfree实现模式其实就是函数组合

Pointfree 案例

用实现Point-free 模式来实现 word wild web ==> W. W. W.

  • 第一步先用空格切割
  • 把数组每一项转化成大些
  • 取出每一项元素第一个字母
  • .空格连接数组
const fp = require('lodash/fp')

const firstLetterToUpper = fp.flowRight(
  fp.join(' '),
  fp.map(fp.first),
  fp.map(fp.toUpper),
  fp.split(' ')
)
// 

console.log(firstLetterToUpper('word wild web')) // W. W. W

这个是否发现我们循环了两次,根据函数结合律我们可以在map里面把转化大写和取第一个字母方法合并

const firstLetterToUpper = fp.flowRight(
  fp.join('. '),
  fp.map(fp.flowRight(fp.first, fp.toUpper)),
  fp.split(' ')
)

console.log(firstLetterToUpper('word wild web')) // W. W. W