js函数式编程(三)-compose和pointFree
compose即函数嵌套组合
组合compose在第一篇已经初见端倪,可以感受一下。compose函数的实现用闭包的方法。不完善实现如下:
const compose = (f, g) => {
return x => f(g(x));
};
compose使用实例
你可以用ramda的compose函数,而不是自己实现。
import {compose} from 'ramda'
const f = (x: number) => 2 * x
const g = (y: number) => y + 1
const w = compose(g, f);
console.log(w(1)) // 3
console.log(w(2)) // 5
console.log(w(3)) // 7
compose的数学特性
有了compose,我们可以很方便的组合,可以使用结合律,即
compose(toUpperCase, compose(head, reverse));
或者
compose(compose(toUpperCase, head), reverse);
你可以想想初中数学,这是成立的。现在多个函数组合成一个大函数,我们的代码开始变得巧妙起来了。
##compose天生pointFree
用compose组合的就是pointFree代码,即你无需指定传递的形参,你可以看看w函数,就知道了。是不是更妙了?其实离上一个妙,我们什么也没做。哈哈哈!
组合像一系列管道那样把不同的函数联系在一起 ----原文
##要注意的是
compose只将不同函数的输出与输入相连,上面代码有一些致命问题,无法分支!或者分支成本巨大,举个例子,如果reverse出错,那么后续就会继续执行,head将拿到错误的输入,继续输出,toUpperCase就错上加错了,当然你可以在每个函数内做严谨的if/else判断,可是成本巨大。目前compose就是一匹脱了缰的骏马。
js函数式编程(三)-compose和pointFree的更多相关文章
- js函数式编程术语总结 - 持续更新
参考文档1 参考文档2 函数式编程术语 高阶函数 Higher-Order Functions 以函数为参数的函数 返回一个函数的函数 函数的元 Arity 比如,一个带有两个参数的函数被称为二元函数 ...
- JS函数式编程 - 概念
最近在看Typescript,顺便看了一些函数式编程,然后半个国庆假期就没有了.做个笔记,分几个部分写吧. 最开始接触函数式编程的时候,第一个接触的概念就是高阶函数,和柯里化.咋一看,这不就是长期用来 ...
- js函数式编程——蹦床函数
概述 这是我在学习函数式编程的时候,关于递归,尾递归,相互递归和蹦床函数的一些心得,记下来供以后开发时参考,相信对其他人也有用. 参考资料:JavaScript玩转Clojure大法之 - Tramp ...
- js函数式编程(二)-柯里化
这节开始讲的例子都使用简单的TS来写,尽量做到和es6差别不大,正文如下 我们在编程中必然需要用到一些变量存储数据,供今后其他地方调用.而函数式编程有一个要领就是最好不要依赖外部变量(当然允许通过参数 ...
- js函数式编程(一)-纯函数
我将写的第一个主题是js的函数式编程,这一系列都是mostly adequate guide这本书的读书总结.原书在gitbook上,有中文版.由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱.中文 ...
- js函数式编程
最近在看朴灵的<深入浅出nodejs>其中讲到函数式编程.理解记录下 高阶函数 比较常见,即将函数作为参数,或是将函数作为返回值得函数. 如ECMAScript5中提供的一些数组方法 fo ...
- js函数式编程curry与compose实现
//自行实现以下curry函数和compose //curry function curry(fn) { return function aa (...arg) { if (arg.length &g ...
- 深入理解JS异步编程三(promise)
jQuery 原本写一个小动画我们可能是这样的 $('.animateEle').animate({ opacity:'.5' }, 4000,function(){ $('.animateEle2' ...
- JS函数式编程【译】2.1 函数式编程语言
随机推荐
- MongoDb 抛出"Error retrieving nonce"异常
MongoDb在读取一个数据时抛出此异常, google之后也是只有源码没有任何相关结果, 考虑到之前同样的Db下不同的Collection没有发现此问题, 对比之后发现出错的url为: mongod ...
- ssh断开后保持程序运行
https://blog.csdn.net/gatieme/article/details/52777721 https://blog.51cto.com/zjking/1117828 https:/ ...
- Java程序员需要突破的技术要点
一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...
- Android NFC P2P
http://www.nfc.cc/2011/12/28/development-android-beam-and-nfc-peer-2-peer/
- [题解](堆)luogu_P1631序列合并
思路来自题解 作者: Red_w1nE 更新时间: 2016-11-13 20:46 在Ta的博客查看 72 最近有点忙 没时间贴代码了== [分析] 首先,把A和B两个序列分别从小到大排序,变成两 ...
- getpass不起作用
#! /usr/bin/env python# -*- coding:utf-8 -*- # login 模块中登录时输入密码,想用getPass模块实现密码的不回显操作.#如下: import ge ...
- [已读]JavaScript高级程序设计(第3版)
从去年开始看,因为太长,总是没有办法一口气把它看完,再加上它与第二版大部分一致,读起来兴致会更缺一点. 与第二版相比,它最大的改变就是增加了很多html5的内容,譬如:Object对象的一些新东西,数 ...
- gin 打linux环境包问题解决
打window包直接go build一下,完事, 但是,打linux包出现如下错误 ..\github.com\mattn\go-isatty\isatty_linux.go:7:8: cannot ...
- 用户会话跟踪机制(session+cookie)
最近在优化之前给学校写的一个项目,发现了同一个浏览器(IE,Firefox)开多个选项卡的时候不能登录多个用户,后一个登录用户会把前一个用户给覆盖了,我的登录逻辑是把user对象存放到session中 ...
- Python 目录和文件基本操作
今天在写一个小工具的过程中发现对目录和文件的基本操作不是很熟,特此把遇到的常用操作总结汇总下. 获取当前路径:os.getcwd() 目录操作:1.创建目录:os.mkdir('目录名')2.创建多级 ...