若一支程序會去修改一另支程序,來達成某種目的,則此程序可稱之為Higher Order Procedure。此外,此程序的參數要是程序。接下來的說明就用Scheme語言來表示。
現在舉一個例子,我們需要寫一支程序,能把某區間的所有整數相加後回傳,Scheme程序如下:
(define (sum-integer a b)
(if (> a b)
0
(+ a (sum-integer (+ a 1) b)))
使用此程序能把從a到b間的整數相加。而今天有另外一件事,是想要相加某區段立方體體積,則可以用下列程序表示:
(define (cube x) (* x x x))
(define (sum-cube a b)
(if (> a b)
0
(+ (cube a) (sum-cube (+ a 1) b)))
可以觀察到sum-integer及sum-cube都有很大程度的相似,這時就可以用Higher Order Procedure來簡化。未來有各種類似工作,都可以此輕鬆達到相同目的:
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))))
term是用來產生每一個單位的程序。next則是接後現在的值,產生下一個要處理的值。a及b不消分說,就是開始以及結束了。使用此Higher Order Procedure後,我們可以改寫原本的sum-integer & sum-cube如下:
(define (identity x) x)
(define (sum-integer a b)
(sum identity a 1+ b))
(define (cube x) (* x x x))
(define (sum-cube a b)
(sum cube a 1+ b))
多有用的一種程序。能把程序寫的簡單又明瞭,除了Scheme以外,我想用其他現在流行的程式語言(C, C++, Java, C#)要達到相同效果,無非是邯鄲學步吧!光是要能直接用程序作為參數,Java就需要
借用Command Pattern才行......