定义映射(计算),执行映射(计算)

对于函数式编程来说,其只关心,定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。

 

函数式编程思想:先构造计算树,然后执行计算树。

 

函数式编程的开发过程是编写计算实现、调用约定、和计算结构的过程;

执行的过程是履行计算约定的过程。

与面相对象做比较:

面向对象是结构的构建,要素是对象与关系;

函数式编程是计算的构建,要素是函数和在遵从调用约定的树上行走的信息流。

 

函数式结构树的构建过程和执行过程都遵从信息流约定。

调用的时机和顺序都有信息流约定来规范。

 

函数式结构树的构建过程只是计算的绑定的过程;从执行的角度看它有另一个术语“惰性求值”:

函数式编程语言还提供惰性求值(Lazy evaluation,也称作call-by-need),是在将表达式赋值给变量(或称作绑定)时并不计算表达式的值,而在变量第一次被使用时才进行计算。

某些编程语言缺省延迟表达式的求值,另一些提供函数或特殊语法来延迟求值。在 Miranda 和 Haskell 中,缺省延迟函数实际参数的求值。在很多其他语言中,可以使用特殊语法明确悬置计算来延迟求值(比如 Scheme 的 "delay" 或 "force"),更一般的通过把一个表达式包装在 thunk 中。表示这种明确延迟求值的对象叫做预期或承诺。

The benefits of lazy evaluation include:

  • The ability to define control flow (structures) as abstractions instead of primitives.

 

结构树的生成与执行:

调用约定、参量约定、信息流约定、promise;

信息流对参量逐步赋值的 过程。

生成的过程是将计算进行保存,而不是使用计算求值的过程。

 

函数式编程需要一些基础设施进行支撑。

根和干的部分由基础设置完成;

枝干和叶子节点由程序员完成。

函数式编程的运行环境都会提供最基本的运算。

 

数据和事件在这个结构树上只相当于信号。

 

统领全局的是输入、输出及处理流程的逻辑,是信息处理的流程。

要关注输出在哪里;通常来说,程序员所做的部分只是整个信息处理系统的一部分。

 

函数式编程与信息处理系统有很多类似的地方;

都是输入信号,然后经过一系列的子系统的处理,最后拿到期望的结果。

 

它的使用场景也有上面的类似性决定:即处理信息和信号流。

 

开发的过程即为为这个信号处理系统添加子系统。

 

不一样的地方在于信号处理系统是单向的;而函数式编程需要使用栈的结构来返回递归和嵌套处理过的值,也包含最终的值。

 

------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。