Schemeで高階関数を書く
高階関数
高階関数とは、引数に関数を指定したり、戻り値として関数を返す関数である。代表的な組み込み高階関数にはmap, filter, foldがある。
map
リストの要素それぞれに同じ関数を適用するにはmap式を使用する。
一般形
(map 関数 リスト)
map式のイメージ
; リストの要素それぞれにsqrt式を適用する > (map sqrt '(1 4 9)) (1 2 3)
例
; リストの要素それぞれを2乗する(square関数を定義して使用した場合) > (map square '(1 2 3 4 5)) (1 4 9 16 25) ; xの2乗を返す (define (square x) (* x x)) ; リストの要素それぞれを2乗する(lambda式を使用した場合) > (map (lambda (x) (* x x)) '(1 2 3 4 5)) (1 4 9 16 25)
filter
ある条件を満たすリストの要素だけを取得するにはfilter式を使用する。
filter式はSRFI-1に定義されている関数である。(R5RSでは規定されていない)
一般形
(filter 関数 リスト)
filter式のイメージ
; リストの要素の中から奇数の要素のみ取得する (filter odd? '(1 2 3))
例
; リストの要素の中から偶数の要素のみ取得する > (filter even? '(1 2 3 4 5)) (2 4) ; リストの要素の中から正の数のみ取得する > (filter positive? '(-1 2 3 -4 5)) (2 3 5)
fold
畳み込みを行うにはfold式を使用する。foldはSRFI-1に定義されている関数である。(R5RSでは規定されていない)
一般形
(fold 関数 初期値 リスト)
fold式のイメージ
; リストを逆順に並び替える(この例ではMzSchemeのfoldl式を使用している) > (foldl cons '() '(1 2 3)) (3 2 1)
例
; リストの要素の数値を全て加算する > (foldl + 0 '(1 2 3 4 5)) 15
; リストの長さを返す > (foldl (lambda (a b) (+ 1 b)) 0 '(1 2 3 4 5)) 5