资讯专栏INFORMATION COLUMN

函数式编程(二)

lixiang / 2119人阅读

摘要:代码组合在函数式编程中,通过将一个个功能单一的纯函数组合起来实现一个复杂的功能,就像乐高拼积木一样,这种称为函数组合代码组合。函数式编程就变成了运用不同的函子,解决实际问题。

高阶函数

满足以下两点的函数:

函数可以作为参数被传递

函数可以作为返回值输出

叫高阶函数,很显然js中的函数满足高阶函数的条件。

函数作为参数:

function pow(x) {
    return x * x;
}
const arr = [1, 2, 3];
const res = arr.map(pow);

函数作为返回值:

function getPrintFn() {
    function print(msg) {
        console.log(msg);
    }
    return print;
}

高阶函数与函数式编程有什么关系?通过上一篇我们知道函数式编程采用纯函数,那怎么把不纯的函数转化为一个纯函数呢?通过把不纯的操作包装到一个函数中,再返回这个函数(即上面的例子),即可达到目的。

柯里化(curry)
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

特点:
接收单一参数,将更多的参数通过回调函数来搞定;
返回一个新函数,用于处理所有的想要传入的参数;
需要利用call/apply与arguments对象收集参数;
返回的这个函数正是用来处理收集起来的参数;

function add(x, y) {
    return x + y;
}

// 柯里化
function add(x) {
    return function(y) {
        return x + y;
    }
}
const increment = add(1);
increment(2); // 3

当我们谈论纯函数的时候,我们说它们接受一个输入返回一个输出。curry 函数所做的正是这样:每传递一个参数调用函数,就返回一个新函数处理剩余的参数。这就是一个输入对应一个输出。curry函数适用于以下场景:

延迟执行:不断的柯里化,累积传入的参数,最后执行。

固定易变因素:提前把易变因素,传参固定下来,生成一个更明确的应用函数。最典型的代表应用,是bind函数用以固定this这个易变对象。

代码组合(compose)

在函数式编程中,通过将一个个功能单一的纯函数组合起来实现一个复杂的功能,就像乐高拼积木一样,这种称为函数组合(代码组合)。下面看一个例子:

最佳实践是让组合可重用。

函子

我们知道,函数式编程实质是通过管道把数据在一系列纯函数间传递,但是,控制流(control flow)、异常处理(error handling)、异步操作(asynchronous actions)和状态(state)呢?还有更棘手的副作用(effects)呢?这些问题的解决就要引入函子的概念了。

我们首先定义一个容器,用来封装数据

函子封装了数据和对数据的操作,functor 是实现了map函数并遵守一些特定规则的容器类型。

把值装进一个容器,而且只能使用 map 来处理它,这么做的理由到底是什么呢?
让容器自己去运用函数能给我们带来什么好处?
Functor 是一个对于函数调用的抽象,我们赋予容器自己去调用函数的能力。当 map 一个函数时,我们让容器自己来运行这个函数,这样容器就可以自由地选择何时何地如何操作这个函数,以致于拥有惰性求值、错误处理、异步调用等等非常牛掰的特性。

函子的类型

1.Maybe(处理null问题)
2.Either(if…else)
3.IO(IO、网络请求、DOM)
4.Monad(嵌套问题)

Maybe

一种用来处理null和undefined问题的函子,避免繁琐的手动判空操作

Either

一种用来处理if…else问题的函子

IO

通过返回一个获取数据的函数来延迟IO的副作用,等调用者去执行有副作用的函数,
以保证获取数据过程中的无副作用特性

Monad

monad 是可以变扁(flatten)的实现了of方法的 functor

总结

学习函数式编程,实际上就是学习函子的各种运算。由于可以把运算方法封装在函子里面,所以又衍生出各种不同类型的函子,有多少种运算,就有多少种函子。函数式编程就变成了运用不同的函子,解决实际问题。

参考文档
https://github.com/xitu/gold-...
https://llh911001.gitbooks.io...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104535.html

相关文章

  • 【响应编程的思维艺术】 (1)Rxjs专题学习计划

    摘要:由于技术栈的学习,笔者需要在原来函数式编程知识的基础上,学习的使用。笔者在社区发现了一个非常高质量的响应式编程系列教程共篇,从基础概念到实际应用讲解的非常详细,有大量直观的大理石图来辅助理解流的处理,对培养响应式编程的思维方式有很大帮助。 showImg(https://segmentfault.com/img/bVus8n); [TOC] 一. 响应式编程 响应式编程,也称为流式编程...

    lscho 评论0 收藏0
  • SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数编程

    摘要:函数式编程,一看这个词,简直就是学院派的典范。所以这期周刊,我们就重点引入的函数式编程,浅入浅出,一窥函数式编程的思想,可能让你对编程语言的理解更加融会贯通一些。但从根本上来说,函数式编程就是关于如使用通用的可复用函数进行组合编程。 showImg(https://segmentfault.com/img/bVGQuc); 函数式编程(Functional Programming),一...

    csRyan 评论0 收藏0
  • 函数编程

    摘要:高阶函数在函数式语言中,函数是这个语言中的一等公民。高阶函数可以接收函数作为参数,或者返回一个函数结果,或者两者同时具备。下面我们看另一个高阶函数我们通过向函数传递一个常量来创建一个函数,将给任意值加上。只要有引用指向它该函数就会一直存在。 上篇文章介绍了纯函数,相信你已经理解了纯函数的概念。下面我们接着看一段代码 let minimum = 21; let checkAge = a...

    高璐 评论0 收藏0
  • JavaScript函数编程

    摘要:函数式编程二拖延症了好久,第二篇终于写出来了。如果你对熟悉的话应该还记得,是可以调用来集中处理错误的对于函数式编程我们也可以做同样的操作,如果运行正确,那么就返回正确的结果如果错误,就返回一个用于描述错误的结果。 JavaScript函数式编程(二) 拖延症了好久,第二篇终于写出来了。 上一篇在这里:JavaScript函数式编程(一) 上一篇文章里我们提到了纯函数的概念,所谓的纯函数...

    booster 评论0 收藏0
  • JavaScript 函数编程

    摘要:注意是单一参数柯里化是由以逻辑学家命名的,当然编程语言也是源自他的名字,虽然柯里化是由和发明的。辨别类型和它们的含义是一项重要的技能,这项技能可以让你在函数式编程的路上走得更远。 slide 地址 三、可以,这很函数式~ showImg(https://segmentfault.com/img/remote/1460000015978685?w=187&h=160); 3.1.函数是一...

    thursday 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<