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