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的类型签名如下:

listof X ::= nil | cons X (listof X)  

定义一个列表求和函数sum

sum nil = 0
sum (cons num list) = num + sum list

sum的这种递归模式, 就是reduce.

可以改写为

add x y = x + y
sum = reduce add 0

reduce的实现如下

(reduce f x) nil = x
(reduce f x) (cons a l) = f a ((reduce f x) l)

同理

product = reduce multiply 1
anytrue = reduce or false
alltrue = reduce and true

理解(reduce f a)的一种方式: 把列表中的cons换成f, nil换成a

例如列表[1,2,3]

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))