背景 在阅读完阮一峰老师的文章和Pointfree JavaScript后,突然感觉自己对函数式编程的理解提升了,所以写下这篇文章。...这里的Point指的是函数的实参,所以PointFree就是没有实参的情况下进行函数组合的编程风格。 常规形式 例子来源于Pointfree JavaScript。...PointFree风格 所谓PointFree风格,就是把功能拆分成非常小的几个点,之后再组合起来,在一切函数调用之前,我们都不需要关心实参是什么,只需要关注自己的逻辑即可。...先定义getEmailOf: function getEmailsOf(users) { return users.map(user => user.email) } 虽然这样写是可以的,但是所谓PointFree
直到有一天,我学到了 Pointfree 这个概念,顿时豁然开朗,原来应该这样用! 我现在觉得,Pointfree 就是如何使用函数式编程的答案。...定义它的时候,根本不需要提到要处理的值,这就是 Pointfree。 四、Pointfree 的本质 Pointfree 的本质就是使用一些通用的函数,组合出各种复杂运算。...定义getWorkers的时候,完全没有提到data,这就是 Pointfree。 简单说,Pointfree 就是运算过程抽象化,处理一个值,但是不提到这个值。...五、Pointfree 的示例一 下面,我们来看一个示例。...现在使用 Pointfree 风格改写(查看完整代码)。
Pointfree Point-free是一种编程风格,这是一种在函数里面实际上没有写任何东西的函数编写方式,这种方式可以将一个函数与其他函数一起生成一个新的函数。...我们可以把数据处理的过程定义成与数据无关的合成运算,不需要用到代表数据的那个参数,只要把简单的运算步骤聚合成一起,在使用这种模式之前我们需要定义一些辅助的基本运算函数,下面这个就是Pointfree模式...需要定义一些辅助的基本运算函数 const f = fp.flowRight(fp.toLower, fp.join('-'), fp.split(' ')) 函数式编程的核心就是把运算过程抽象成函数,而Pointfree...const f = fp.flowRight(fp.replace(/\s+/g, '-'), fp.toLower) console.log(f(['AAA BBBB'])) 可以看出来Pointfree...实现模式其实就是函数组合 Pointfree 案例 用实现Point-free 模式来实现 word wild web ==> W.
Pointfree 风格 Pointfree 的意思是不使用所要操作的数据,只合成运算过程。...下面是使用Ramda[1]函数库的pipe方法实现 Pointfree 的例子,选自阮一峰老师的《Pointfree 编程风格指南》[2]。...这就是 Pointfree 风格的优势。Ramda 提供了很多现成的方法,可以直接使用这些方法,省得自己定义一些常用函数(查看完整代码[3])。...现在使用 Pointfree 风格改写(查看完整代码[6])。...纯函数的实现可以参考Pointfree Utilities[10]。
那这 pointfree 有什么用? 它可以让我们把注意力集中在函数上,参数命名的麻烦肯定是省了,代码也更简洁优雅。...需要注意的是,一个 pointfree 的函数可能是由众多非 pointfree 的函数组成的,也就是说底层的基础函数大都是有参的,pointfree 体现在用基础函数组合而成的高级函数上,这些高级函数往往可以作为我们的业务函数...可以说 pointfree 使我们的编程看起来更美,更具有声明式,这种风格算是函数式编程里面的一种追求,一种标准,我们可以尽量的写成 pointfree,但是不要过度的使用,任何模式的过度使用都是不对的...柯里化函数可以使我们更好的去追求 pointfree,让我们代码写得更优美!...总结 在这篇文章里我重点想介绍的是函数以组合的方式来完成我们的需求,另外介绍了一种函数式编程风格:pointfree,让我们在函数式编程里面有了一个最佳实践,尽量写成 pointfree 形式(尽量,不是都要
pointfree pointfree 模式指的是,函数无须提及将要操作的数据是什么样的。一等公民的函数、柯里化(curry)以及组合协作起来非常有助于实现这种模式。...// 非 pointfree,因为提到了数据:word var snakeCase = function (word) { return word.toLowerCase().replace(/\s...+/ig, '_'); }; // pointfree var snakeCase = compose(replace(/\s+/ig, '_'), toLowerCase); 利用 curry,我们能够做到让每个函数都先接收数据...另外注意在 pointfree 版本中,不需要 word 参数就能构造函数;而在非 pointfree 的版本中,必须要有 word 才能进行一切操作。...pointfree 模式能够帮助我们减少不必要的命名,让代码保持简洁和通用。
// 非 pointfree,因为提到了数据:wordvar snakeCase = function (word) { return word.toLowerCase().replace(/\s+/...另外注意在 pointfree 版本中,不需要 word 参数就能构造函数;而在非 pointfree 的版本中,必须要有 word 才能进行一切操作。...pointfree 模式能够帮助我们减少不必要的命名,让代码保持简洁和通用。
return function(){ [].push.apply(args, arguments); return fn.apply(this, args); } } //map pointfree...提示二: 没有相关经验的读者在使用pointfree风格的map操作符时可能会感到非常不适应,如果你觉得它很难理解,也可以尝试直接使用IO.prototype.map这种链式调用风格的写法将上例中的三个步骤组合在一起来查看最后的结果...__value; } //pointfree风格运算符 var join = (m)=>m.join(); 这里引入一个新的概念Monad,它的定义是可以被展平的容器,也就是说拥有join和of方法并遵循一定规则的容器
Pointfree 编程风格 我之前提过一下 Pointfree 这种编程风格,它其实就是强调在整个函数编写过程中不出现参数(point),而只是通过函数的组合生成新的函数,实际数据只需要在最后使用函数的时候再传入即可...// Pointfree 没有出现需要操作的参数 const upperLastItem = compose(toUpperCase, head, reverse); // 非 Pointfree...但是凡事无绝对,学了 Pointfree 这种风格并不意味着你要强迫自己做到一个参数都不能出现(比如很多基础函数,他们本身的编写就不是 Pointfree 的),函数式编程也不是所有场合都完全适用的,具体情况具体分析...使用 Pointfree 编程风格,减少无意义的中间变量,让代码更且可读性。 - EOF -
)), b是fn3, 第三次运行的时候则是a是(...args) => fn1(fn2(fn3(...args))), b是fn4, 最后返回了fn1(fn2(fn3(fn4(...args)))) pointfree...// 非 pointfree,因为提到了数据:word var snakeCase = function (word) { return word.toLowerCase().replace(/\s...+/ig, '_'); }; // pointfree var snakeCase = compose(replace(/\s+/ig, '_'), toLowerCase); pointfree...对函数式代码来说,pointfree 是非常好的石蕊试验,因为它能告诉我们一个函数是否是接受输入返回输出的小函数。比如,while 循环是不能组合的。...不过你也要警惕,pointfree 就像是一把双刃剑,有时候也能混淆视听。并非所有的函数式代码都是 pointfree 的,不过这没关系。可以使用它的时候就使用,不能使用的时候就用普通函数。
Pointfree 编程风格 我之前提过一下 Pointfree 这种编程风格,它其实就是强调在整个函数编写过程中不出现参数(point),而只是通过函数的组合生成新的函数,实际数据只需要在最后使用函数的时候再传入即可...// Pointfree 没有出现需要操作的参数 const upperLastItem = compose(toUpperCase, head, reverse); // 非 Pointfree...但是凡事无绝对,学了 Pointfree 这种风格并不意味着你要强迫自己做到一个参数都不能出现(比如很多基础函数,他们本身的编写就不是 Pointfree 的),函数式编程也不是所有场合都完全适用的,具体情况具体分析...使用 Pointfree 编程风格,减少无意义的中间变量,让代码更且可读性。
如果像我一样,你喜欢 PointFree Composable Architecture[5],你可能想要注入 reducer 代码。...https://github.com/krzysztofzablocki/Inject [4] Sourcery Pro: http://merowing.info/sourcery-pro/ [5] PointFree
(可阅读《mostly-adequate-guide》 ) 假如要写 Pointfree Javascript 风格的代码,那么Currying是不可或缺的。...所以在文末再次安利JavaScript 程序员阅读此书 —— 《mostly-adequate-guide》 参考: 柯里化——维基百科 《JS 函数式编程指南》 Pointfree 编程风格指南——阮一峰
假如要写 Pointfree Javascript 风格的代码,那么柯里化是不可或缺的。
这两个例子都使用了 Pointfree 风格。 可以看到,transduce非常有利于代码的复用,可以将一系列简单的、可复用的函数合成为复杂操作。
//fp 模块就不会出现这种问题 //fp map 的函数的参数只有一个就是处理的参数 console.log(fp.map(parseInt,['23','8','10']));//23 8 10 PointFree...不需要指明处理的数据 只需要合成运算过程 需要定义一些辅助的基本运算函数 PointFree 模式 「不需要关心数据」 const f = fp.flowRight(fp.join('-'),fp.map...(fp.toLower),fp.split(' ')); 案例演示,其实PointFree模式就是函数的组合,「函数组合不需要处理数据的,返回的新函数来处理数据」 //Hello world => hello_world.../\s+/g,'_'),fp.toLower);//函数组合不需要处理数据 //返回新的函数来处理数据 console.log(f('Hello world')); 下面我们在写一个案例来更深入的理解PointFree
. (+3)) 4 函数组合可以用来制造新函数,并且能够把参数抽出来,例如: -- f x = 2 * (sqrt x) + 1 -- 对应的pointfree style f = (+ 1) . (*...这种只通过函数组合得到的,不涉及实际参数的函数风格被称为pointfree style P.S.注意,巨长的函数链会降低可读性,不鼓励这样做,应该通过let/where等声明把函数链拆开并赋予语义 五.
swift-snapshot-testing[8] TCA: https://github.com/pointfreeco/swift-composable-architecture[9] Point Free: https://www.pointfree.co...swift-composable-architecture/tree/0.35.0/Examples[14] 上架应用: https://github.com/pointfreeco/isowords[15] 指引链接: https://www.pointfree.co
柯里化、管道、高阶性、闭包、不可变性、递归、partial monad 、 monadic 、 functor 、 applicative 、尾递归、严格求值/非严格求值、无限流和共递归、状态转移、 pointfree...4、pointfree——隐式编程 函数无需要提及将要操作的数据是什么。也就是说,函数不用指明操作的参数,而是让组合它的函数来处理参数。 通常使用柯里和组合来实现 pointfree。
链式操作可以消除中间状态,实现 Pointfree 风格。 处理副作用。 包裹异步 IO 等副作用函数,放在最后一步执行。 还记得 Jquery 时代的 ajax 操作吗?
领取专属 10元无门槛券
手把手带您无忧上云