javascript(函数式编程思考) ---> Map-Filter-quicksort-Collatz序列-Flodl-Flodr
let add = x=>x+1; //Map :: ( a -> b) -> [a] -> [b]
let Map = function(f,arr){
//闭包存储累积对象
let result = [];
return function map(f,arr){
if(!Array.isArray(arr)){
return "要处理的对象为数组";
}
if(arr.length ==0){
return [];
}else{
let [head,...tail] = arr;
result.push(f(head));
// 通过回调map遍历目标对象arr,f处理过的元素存入result,tail为[]即遍历结束,可以返回result
return tail.length == 0 ? result : map(f,tail);
}
}(f,arr);
};
let test = Map(add,[1,2,3]);
console.log(test);//[2,3,4]
let biggerTen = x => x>10;
//Filter :: (a -> Bool) -> [a] -> [a]
let Filter = function(f,arr){
let result=[];
return function filter(f,arr){
if(!Array.isArray(arr)){
return "要处理的对象为数组";
}
if(arr.length == 0){
return [];
}else{
let [head,...tail] = arr;
if(f(head)){
result.push(head)
}
return tail.length == 0 ? result : filter(f,tail);
}
}(f,arr);
}; let testFilter = Filter(biggerTen,[1,5,10,44,12,2,5]);
console.log(testFilter);//[44,12]
快速排序:
let small = x=>y=>y <=x;
let bigger = x=>y=>y > x;
console.log(Filter(bigger(5),[7,2,1,4]));
console.log(Filter(small(5),[7,2,1,4])); //QuickSort :: (Ord a) => [a] -> [a]
let QuickSort = (function(){
return function quickSort(arr){
if(arr.length == 0){
return [];
}else{
let [head,...tail] = arr;
let smallerSorted = quickSort(Filter(small(head),tail));
let biggerSorted = quickSort(Filter(bigger(head),tail));
return smallerSorted.concat([head]).concat(biggerSorted);
}
};
})(); let testQuickSort = QuickSort([5,7,2,1,4]);
console.log(testQuickSort);//[1,2,4,5,7]
Collatz序列:
let div2 = x=>x/2;
let someF = x=>x*3+1; const Chain = function(n){
let result=[];
return function chain(n){
result.push(n);
if(n == 1){return [1]}
let even = n%2 ==0 ? chain( div2(n) ) : [];
let odd = n%2 !=0 ? chain( someF(n)) : [];
return result;
}(n);
};
console.log(Chain(10));//[10,5,16,8,4,2,1]
Foldl:
// 左折叠
const Foldl = function(f,list,initValue){
if(list.length == 0){
return initValue || null;
}else{
let accumulated=initValue || list.shift() ;
let foldl = function(acc,x){
accumulated = f(acc,x);
return list.length==0 ? accumulated : foldl(accumulated,list.shift());
}
return list.length==0 ? accumulated : foldl(accumulated,list.shift());
}
} let reducer = (x,y) => (x+y);
let reducerMultiply = (x,y) => x*y;
console.log(Foldl(reducer,[1,2,3]));//
console.log(Foldl(reducerMultiply,[2,3,4]));//
Foldr:
// 右折叠
const Foldr = function(f,list,initValue){
if(list.length == 0){
return initValue || null;
}else {
let accumulated = initValue || list.pop();
let foldr = function(x,acc){
accumulated = f(x,acc);
return list.length==0 ? accumulated : foldr(list.pop(),accumulated);
}
return list.length==0 ? accumulated : foldr(list.pop(),accumulated);
}
} let reverse = (x,y) => {
y.push(x);
return y;
}; console.log(Foldr(reverse,[1,2,3],[]));//[3,2,1]
用Fold重新创建新的Map和Filter:
// 用Foldr创建新的Filter 当然也可以用Foldl
const newFilter = function(f,list){
let condition = function(x,acc){
f(x) && acc.push(x);
return acc;
}
let result = Foldr(condition,list,[]);
return Foldr(reverse,result,[]);
} let bigger20 = x=>x>20; console.log(newFilter(bigger20,[10,22,50,1,41,2])); // [22,50,41] // 用Foldl 创建新的Map
const newMap = function(f,list){
let map = function(acc,x){
acc.push(f(x));
return acc;
}
return Foldl(map,list,[]);
}
let addTwo = x => x+2;
console.log(newMap(addTwo,[1,2,3]));//[3,4,5]
javascript(函数式编程思考) ---> Map-Filter-quicksort-Collatz序列-Flodl-Flodr的更多相关文章
- Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数
Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...
- 转:JavaScript函数式编程(三)
转:JavaScript函数式编程(三) 作者: Stark伟 这是完结篇了. 在第二篇文章里,我们介绍了 Maybe.Either.IO 等几种常见的 Functor,或许很多看完第二篇文章的人都会 ...
- 转: JavaScript函数式编程(二)
转: JavaScript函数式编程(二) 作者: Stark伟 上一篇文章里我们提到了纯函数的概念,所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环 ...
- 转:JavaScript函数式编程(一)
转:JavaScript函数式编程(一) 一.引言 说到函数式编程,大家可能第一印象都是学院派的那些晦涩难懂的代码,充满了一大堆抽象的不知所云的符号,似乎只有大学里的计算机教授才会使用这些东西.在曾经 ...
- JavaScript 函数式编程读书笔记1
概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...
- 一文带你了解JavaScript函数式编程
摘要: 函数式编程入门. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函 ...
- JavaScript 函数式编程读书笔记2
概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...
- 函数式编程工具:filter和reduce
# -*- coding: utf-8 -*- #python 27 #xiaodeng #函数式编程工具:filter和reduce #python内置函数中,map函数是用来进行函数式编程这类工具 ...
- javascript函数式编程和链式优化
1.函数式编程理解 函数式编程可以理解为,以函数作为主要载体的编程方式,用函数去拆解.抽象一般的表达式 与命令式相比,这样做的好处在哪?主要有以下几点: (1)语义更加清晰 (2)可复用性更高 (3) ...
随机推荐
- hdu1536(sg函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536 题意:首先输入K 表示一个集合的大小 之后输入集合 表示对于这对石子只能去这个集合中的元素的个 ...
- IT兄弟连 JavaWeb教程 El基本语法
EL(Expression Language)表达式语言是在JSP 2.0版本中引入的新特性,它用于JSP文件中的数据访问.这种表达式语言能简化JSP文件中数据访问的代码,可用来替代传统的基于&quo ...
- 后Selenium时代,网页自动化测试用Cypress
本文技术难度★★★,初学自动化测试的朋友慎点!否则会引起焦虑等不适症状,严重者会怀疑自己技术人生! 来自Cypress官网首页! Web开发飞速换代! table控制页面OUT了! 原生态手写网页OU ...
- iOS 7 隐藏特性
当 iOS7 刚发布的时候,全世界的苹果开发人员都立马尝试着去编译他们的app,接着再花上数月的时间来修复任何出现的故障,甚至重做app.这样的结果,使得人们根本无暇去探究 iOS7 所带来的新东西. ...
- html table导出到Excel中,不走后台,js完成
静态表格table <table class="table tableStyles" id="tables"> <caption>不正经 ...
- hibernate错误总结1
- VLAN-5-802.1Q-in-Q隧道
Q-in-Q允许SP在跨越WAN服务时,保留802.1Q VLAN标签.由此,VLAN可以被拓展到多个地理分散的站点上. 入向SP交换机收到802.1Q数据帧,使用额外的802.1Q头部来标记 ...
- C# 面向对象之继承后初始化顺序
使用继承之后当我们初始化一个子类时子类的初始化顺序为: (1)初始化类的实例字段 (2)调用基类的构造函数,如果没有指明基类则调用System.Object的构造函数; (3)调用子类的构造函数
- scrapy框架的命令行解释
scrapy框架的命令解释 创建爬虫项目 scrapy startproject 项目名例子如下: scrapy startproject test1 这个时候爬虫的目录结构就已经创建完成了,目录结构 ...
- morphia(3)-查询
1.查询所有 @Test public void query() throws Exception { final Query<Employee> query = datastore.cr ...