函数式编程

1、函数真没什么特殊的,你可以像对待任何其他数据类型一样对待它们——把它们存在数组里,当作参数传递,赋值给变量...等等。

扩展特性
Object.isExtensible 方法
Object.preventExtensions 方法

密封特性
Object.isSealed 方法
Object.seal 方法

冻结特性
Object.isFrozen 方法
Object.freeze 方法

浅冻结 与 深冻结

2、纯函数
纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

函数式编程的哲学就是假定副作用是造成不正当行为的主要原因。

我们可以使用一种叫做“等式推导”(equational reasoning)的技术来分析代码。

面向对象语言的问题是,它们永远都要随身携带那些隐式的环境。你只需要一个香蕉,但却得到一个拿着香蕉的大猩猩...以及整个丛林

3、纯函数的好处
可缓存性(Cacheable)、可移植性/自文档化(Portable/Self-Documenting)、可测试性(Testable)、合理性(Reasonable)

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

5、组合 (compose)
两个函数组合之后返回了一个新函数是完全讲得通的:组合某种类型(本例中是函数)的两个元素本就该生成一个该类型的新元素。把两个乐高积木组合起来绝不可能得到一个林肯积木。所以这是有道理的,我们将在适当的时候探讨这方面的一些底层理论。

在 compose 的定义中,g 将先于 f 执行,因此就创建了一个从右到左的数据流。这样做的可读性远远高于嵌套一大堆的函数调用

让代码从右向左运行,而不是由内而外运行

pointfree 模式指的是,永远不必说出你的数据。

范畴学(category theory)是数学中的一个抽象分支,能够形式化诸如集合论(set theory)、类型论(type theory)、群论(group theory)以及逻辑学(logic)等数学分支中的一些概念。范畴学主要处理对象(object)、态射(morphism)和变化式(transformation),而这些概念跟编程的联系非常紧密

范畴:
对象的搜集
态射的搜集
态射的组合
identity 这个独特的态射

组合像一系列管道那样把不同的函数联系在一起,数据就可以也必须在其中流动——毕竟纯函数就是输入对输出,所以打破这个链条就是不尊重输出,就会让我们的应用一无是处。
我们认为组合是高于其他所有原则的设计原则,这是因为组合让我们的代码简单而富有可读性。另外范畴学将在应用架构、模拟副作用和保证正确性方面扮演重要角色。

6、示例应用

// 命令式
var makes = [];
for (i = 0; i < cars.length; i++) {
  makes.push(cars[i].make);
}


// 声明式
var makes = cars.map(function(car){ return car.make; });

命令式:怎么做
声明式:做什么

7、特百惠
函数式的程序即通过管道把数据在一系列纯函数间传递的程序。

你可能感兴趣的:(函数式编程)