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 函数式编程语言
随机推荐
- MySql 长时间读数据发生超时的异常 Mysql Reader Exception TimeOut expired
mysql connector: .net var r = cmd.ExecuteReader() r.Reader() // <--长时间不停调用 Timeout expired. Th ...
- uoj#79. 一般图最大匹配(带花树)
传送门 带花树 不加证明的说一下过程好了:每次从一个未匹配点\(S\)出发bfs,设\(S\)为\(1\)类点,如果当前点\(v\)在本次bfs中未经过,分为以下两种情况 1.\(v\)是未匹配点,那 ...
- perl C/C++ 扩展(四)
在前面三篇博客中,我们了解到如何使用c/c++ 扩展自己的perl 库,但是博主在学习过程中,对动态库或静态库的加载不是十分了解,后来自己又细挖一下.后来就有了这篇博文,再后来,没有再后来了,囧!! ...
- sql 语句 替换字段的一些内容
update t_table set field = replace(field,'替换内容','替换为');
- CSS以及JS各种库的在线CDN引用地址
JS类—— html5.js,让你的IE浏览器支持H5新特性:http://html5shiv.googlecode.com/svn/trunk/html5.js (记得要注释判断哦) JQuer ...
- linux系统任务调度命令crontab
循环重复的执行计划任务.有计划性的执行任务,像这种任务,在linux系统中就有cron命令来完成. linux系统下的任务调度分为两类:系统任务调度和用户任务调度. /etc/crontab文件就是系 ...
- 安装gnvm (windows下nodejs版本管理工具)
一些写在前面的话,为什么装这个?前两天看avalon视频的时候,里面有介绍去哪儿的前端构建工具fekit.我这人吧,好奇心特别强,就打算安装用用看.在安装时它提示要求node版本0.8.x,所以我选择 ...
- CentOS7.2 安装iptables
1 先检查是否安装了iptables: service iptables status iptables -L ls /etc/sysconfig/ 综上:命令报错,且 iptables不存在,那 ...
- 学习typescript(一)
环境 必装软件 node,推荐 node 8.0 npm,推荐 npm 5.0 git, 最新版 vscode, 编绎器 必装包 tsc: npm install -g typescript typi ...
- Minikube-Kubernetes本地环境进行开发
Minikube-Kubernetes本地环境进行开发 使用Minikube 启动Minikube # 启动 minkube start # 检查状态 minikube status host: Ru ...