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. Codevs 1282 约瑟夫问题

    1282 约瑟夫问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 有编号从1到N的N个小朋友在玩一种 ...

  2. mysql8必知必会7 连接 内连接 外连接 交叉连接

    /* 2 需求:建立产品和分类表 1.查询每种分类的产品数量,没有产品的分类也要统计.(cname,quantity) 2.根据分类名称查询分类中的所有产品 */ -- --------------- ...

  3. mysql(MySQL客户端连接工具)

    在MySQL提供的工具中,DBA使用最频繁的莫过于mysql.这里的mysql不是指MySQL服务,也不是mysql数据库,而是连接数据库的客户端工具.类似于Oracle的sqlplus. 语法: m ...

  4. 牛客网Java刷题知识点之线程的几种可用状态(新建、可运行、运行、阻塞、死亡)

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=13 ...

  5. dataTable 中数据的居中显示

    遇到了一个小问题,就是在向dataTable中添加数据时,数据总是向左对齐,而dataTable又没有设置数据对齐的方法,这里写一个在网上看到的一个方法,分享出来看一下,简单实用. html代码如图1 ...

  6. hasNextInt()方法

    hasNextInt()方法是判断控制台接收是否为数字,当你在控制台输入一个字符的时候,hasNextInt()判断你输入这个字符是不是数字,而不是接收值,当if判断通过之后执行接收,也就是你输入的那 ...

  7. JS中的回收机制

    js的设计者为了让没有必要的变量保存在内存中,(我们写的任何变量都是需要内存空间的),什么叫没有必要的变量?也就是说你不在需要这个变量的时候它就会被销毁?那么你肯定会问js怎么知道那些变量是我们不需要 ...

  8. ExpandableListView 安卓二级菜单

    ExpandableListView可以显示一个视图垂直滚动显示两级列表中的条目,这不同于列表视图(ListView).ExpandableListView允许有两个层次:一级列表中有二级列表.比如在 ...

  9. Sencha Touch和jQuery Mobile的比较

    第一组-行销和平台支持 Sencha Touch和jQuery Mobile都以HTML5框架著称.jQuery Mobile谦虚的说自己只是内建于所有流行的移动设备平台,而Sencha Touch则 ...

  10. 【R语言进行数据挖掘】回归分析

    1.线性回归 线性回归就是使用下面的预测函数预测未来观测量: 其中,x1,x2,...,xk都是预测变量(影响预测的因素),y是需要预测的目标变量(被预测变量). 线性回归模型的数据来源于澳大利亚的C ...