函数式编程总结

  • unary 函数

接收一个函数,将它的参数长度变为 1。比如 parseInt 接收两个参数,因此使用 map 方法会发生错误。这时候就是它的用武之地了

`const unary = (fn) => {

return fn.length === 1 ? fn : arg => fn(arg)

}`

  • once 函数

接收一个函数。顾名思义,就是该函数只能运行一次,比如支付等场景下

`// ES6

const once = (fn) => {

let done = false;

return function(){

return done ? undefined 😦(done = true),fn.apply(this,arguments));

}

}`

  • memoized 函数

接收一个函数,返回一个函数,每次调用的结果先在 cache 中找,如果找不到再调用原函数。

`// ES6

const memoized = (fn) => {

const cache = {}

return (arg) => cache[arg] || (cache[arg] = fn(arg))

}

// ES5

var memoized = function(fn){

var cache = {}

return function(arg){

return cache[arg] || (cache[arg] = fn(arg))

}

}`

具体可以参考 函数式编程之闭包与高阶函数

第五章 数组的函数式编程

首先我们介绍了投影的概念,即传入值并返回值的函数称为投影函数,比如 map。然后我们简单实现了 map,filter,concatAll,reduce 和 zip 函数

  • map 函数

`const map = (array, fn) => {

let results = [];

for(let value of array){

results.push(fn(value))

}

return results

}`

  • filter 函数

`const filter = (array, fn) => {

let results = [];

for(let value of array){

fn(value) ? results.push(fn(value)) : undefined

}

return results

}`

  • concatAll 函数

concatAll 函数主要用于数组的扁平化

`const concatAll = (array,fn) => {

let results = []

for(let value of array){

results.push.apply(results,value);

}

return results

}`

  • reduce 函数

`// 值默初始值认为 0 的实现

const reduce = (array,fn) => {

let accumlator = 0;

for(let value of array){

accumlator = fn(accumlator,value)

}

return accumlator

}

// 带初始值实现

const reduce = (array,fn,initial) => {

let accumlator;

if(initial != undefined){

accumlator = initial;

}else{

accumlator = array[0];

}

if(initial === undefined){

for(let i = 1; i < array.length; i++){

accumlator = fn(accumlator,array[i])

}

}else{

for(const value of array){

accumlator = fn(accumlator,value)

}

}

return [accumlator];

}`

  • zip 函数

zip 函数主要是用于合并两个给定的数组。如{ id:1,name:'zhangsan' } {id:1,age:'20'},合并成 { id:1,name:'zhangsan',age:'20'}。它接受三个参数,前两个分别是两个待合并的数组。最后一个是作用于这两个数组的函数。

`const zip = (leftArr,rightArr,fn) => {

let index,results = [];

for(index = 0;index < Math.min(leftArr.length,rightArr.length); index++){

results.push(fn(leftArr[index],rightArr[index]));

}

return results;

}`

具体可以参考 函数式编程之数组的函数式编程

第六章 柯里化与偏应用

本章中我们了解了柯里化与偏应用的基本概念,并实现了柯里化与偏函数。它们主要是用来减少函数的参数的。

  • 柯里化

柯里化是一个把多参数函数转换为一个嵌套的一元函数的过程。具体的实现过程如下

`const curry = function(fn){

return function curried(…args){

if(args.length < fn.length){

return function(){

return curried.apply(null,args.concat(arguments));

}

}else{

return fn.apply(null,args)

}

}

}`

  • 偏应用

偏应用是为了弥补柯里化不足的地方产生的。柯里化的参数只能从前往后传,而偏函数的参数可以空出任意位置的参数。具体实现如下

`const partial = (fn,…partialArgs){

let args = partialArgs

return (…fullArgs) => {

let arg = 0;

for(let i = 0; i < args.length && i < fullArgs.length; i++){

if(args[i] === undefined){

args[i] = fullArgs[arg++]

}

}

return fn.apply(null,…args);

}

}`

具体可以参考 函数式编程之柯里化与偏应用

第七章 组合与管道

这一章我们由 unix 系统的管道符引出函数式编程中的组合与管道。并且了解到了函数式编程遵循结合律。因此我们可以在 compose 和 pipe 函数中任意组合函数,并且最后得到的结果都是一样的。这就能让我们组合出无数种函数。这一节最重要的是 compose 和 pipe 函数。

  • compose 函数

compose 函数主要是用于将多个函数组合成一个函数

`const compose = (fns) => {

return function(value){

let fnsCopy = fns.concat(); // 还记得我们发现的 bug 吗

fnsCopy.push(value);

return fnsCopy.reverse().reduce((acc,fn)=>{

return fn(acc);

})

}

}`

  • pipe 函数

pipe 函数其实和 compose 函数一样,只是方向的区别。compose 函数是从后往前,pipe 函数是从前往后,仅此而已。

`const pipe = (fns) => {

return function(value){

let fnsCopy = fns.concat();

fnsCopy.unshift(value);

return fnsCopy.reduce((acc,fn)=>{

return fn(acc);

})

}

}`

具体可以参考 函数式编程之组合与管道

第八章 函子

这一章我们从如何使用函数式编程的思想处理异常开始,引出了函子的概念。函子其实就是一个普通的对象,但是它实现了 map 方法,在遍历每个值的时候会返回一个新的值。并且如果函子带有 of 方法的话就是一个 pointed 函子(例如 ES6 数组新增了 Array.of 方法,且具有 map 方法,所以它本身就是一个 pointed 函子)。然后我们介绍了两个重要的函子 MayBe 函子和 Either 函子,并以掘金的文章为例展示了函子处理的过程。

  • 普通函子

`const Container = function(value){

this.value = value;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-ttsEEzaM-1715834993832)]

[外链图片转存中…(img-frNASVdS-1715834993832)]

[外链图片转存中…(img-9j1feqj4-1715834993833)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值