# Why Functional Programming Matters ## 1. Introduction 传统的解释fp编程的特点, 没有说服力 - no assignment - no side-effect - no control flow ## 2. An Analogy with Structured Programming 结构化编程的优点? `no goto`? 核心还是结构化编程的模块化设计. - 小模块能够快速实现 - 模块容易复用 - 模块容易独立测试 fp为组合程序提供了两种更新, 更好的胶水(glue) ## 3. Glueing Functions Together 列表处理为例 listof的类型签名如下: ```haskell listof X ::= nil | cons X (listof X) ``` 定义一个列表求和函数`sum` ```haskell sum nil = 0 sum (cons num list) = num + sum list ``` `sum`的这种递归模式, 就是`reduce`. 可以改写为 ```haskell add x y = x + y sum = reduce add 0 ``` `reduce`的实现如下 ```haskell (reduce f x) nil = x (reduce f x) (cons a l) = f a ((reduce f x) l) ``` 同理 ```haskell product = reduce multiply 1 anytrue = reduce or false alltrue = reduce and true ``` 理解`(reduce f a)`的一种方式: 把列表中的`cons`换成`f`, `nil`换成`a` 例如列表[1,2,3] ```haskell cons 1 (cons 2 (cons 3 nil)) -- reduce add 0 add 1 (add 2 (cons 3 0)) -- reduce multiply 1 multiply 1 (multiply 2 (multiply 3 1)) ```