传统的解释fp编程的特点, 没有说服力
no assignment
no side-effect
no control flow
结构化编程的优点? no goto?
核心还是结构化编程的模块化设计.
小模块能够快速实现
模块容易复用
模块容易独立测试
fp为组合程序提供了两种更新, 更好的胶水(glue)
列表处理为例
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))