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的更多相关文章

  1. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

  2. 转:JavaScript函数式编程(三)

    转:JavaScript函数式编程(三) 作者: Stark伟 这是完结篇了. 在第二篇文章里,我们介绍了 Maybe.Either.IO 等几种常见的 Functor,或许很多看完第二篇文章的人都会 ...

  3. 转: JavaScript函数式编程(二)

    转: JavaScript函数式编程(二) 作者: Stark伟 上一篇文章里我们提到了纯函数的概念,所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环 ...

  4. 转:JavaScript函数式编程(一)

    转:JavaScript函数式编程(一) 一.引言 说到函数式编程,大家可能第一印象都是学院派的那些晦涩难懂的代码,充满了一大堆抽象的不知所云的符号,似乎只有大学里的计算机教授才会使用这些东西.在曾经 ...

  5. JavaScript 函数式编程读书笔记1

    概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...

  6. 一文带你了解JavaScript函数式编程

    摘要: 函数式编程入门. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函 ...

  7. JavaScript 函数式编程读书笔记2

    概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...

  8. 函数式编程工具:filter和reduce

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #函数式编程工具:filter和reduce #python内置函数中,map函数是用来进行函数式编程这类工具 ...

  9. javascript函数式编程和链式优化

    1.函数式编程理解 函数式编程可以理解为,以函数作为主要载体的编程方式,用函数去拆解.抽象一般的表达式 与命令式相比,这样做的好处在哪?主要有以下几点: (1)语义更加清晰 (2)可复用性更高 (3) ...

随机推荐

  1. 3DMAX 6 游戏特效制作

    3d主要是粒子系统为主,一个特效可能包含多个粒子系统,需要注意粒子系统尽量减少多余参数,材质shader在手机上要经过优化 另外可以使用面片加脚本实现滚动效果,比如瀑布等等 具体方法以后补充,占位

  2. bzoj 3876: [Ahoi2014&Jsoi2014]支线剧情【有上下界有源汇最小费用最大流】

    每条边流量有下界有费用,很显然是有上下界有源汇最小费用最大流 连边(s,1,(0,inf),0),(i,t,(0,inf),0),表示从1出发inf次从每个点结束inf次 连边(i,j,(1,inf) ...

  3. IT兄弟连 JavaWeb教程 JSTL常用标签

    1.条件标签 条件标签能够实现Java语言中的if语句以及if-else语句的功能,它包括以下几种: <c:if>:用于实现Java语言中的if语句的功能. <c:choose> ...

  4. log4j2中LevelRangeFilter的注意点

    LevelRangeFilter的注意点 在log4j2中,LevelRangeFilter的minLevel,maxLevel的配置是和log4j 1.x相反的:minLevel需要配置的是高级别, ...

  5. Jmeter-提取Json数据进行关联

      1:Json后置处理器提取结果作为下一个sampler的传入参数 1.1:[线程组]->[简单控制器]->[HTTP sampler]->[Beanshell后置取样器]-> ...

  6. Linux —— 常用命令集合

    关机和重启命令 shutdown [选项] 时间 (添加&,把关机任务放在后台执行) 只有shutdown可以保存关机时资源 操作选项 重启: r 关机: h 取消一个关机任务: c 关机命令 ...

  7. session是什么时候创建的

    总结:session不是一打开网站就会立刻建立.它的建立需要基于下面两个条件中的任意一个: 1:在servlet中手动调用 HttpSession session = request.getSessi ...

  8. IT人怎样防止过劳死?如何成为时间的主人?

    投行的朋友还没走几天,搜狐的一位同胞又去了.又是过劳死!    每当读到这类新闻,IT人无不反镜自照,顾影自怜.无法拼爹拼钱的我们,似乎只有拼命了.生活好惨淡啊!    有人说:年轻人,悠着点儿!立刻 ...

  9. 洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

    贪婪的送礼者Greedy Gift Givers 难度:☆ Code: #include <iostream> #include <cstdio> #include <c ...

  10. 【javascript】2017-9-12 腾讯笔试小Q升序算法

    刚做完笔试,腾讯笔试系统真的不友好,作为一个前端,我只会用js写编程题,然而,然而腾讯笔试系统连js输入函数都没给,还不准跳出页面,那个调试结果一直显示错误,我一直找不到错误在哪,心累. 只做了一道笔 ...