高階関数の例 (2/3)


map を使おう

高階関数の例としてよく出て来るのは、 map 関数です。
        (map func list) 
は、listの要素elem_0, ... ,elem_k に対して、 (func elem_0), ..., (func elem_k) を要素とするリストを返します。
> (define (square x) (* x x))
> (map square (list 1 2 3 4 5 6))
(1 4 9 16 25 36)
> (define sample (list (list) (list 1) (list 1 2) (list 1 2 3)))
> sample
(() (1) (1 2) (1 2 3))
> (map length sample)
(0 1 2 3)
map は 複数のリストを引数に持つことも出来ます。 この場合 func も複数引数をもつ関数となります。 つまり、 (map func list-0 ... list-n) は、 同じ長さの list-0, ..., list-n に対して、 同じ長さのリスト list-result を返します。 但し、結果の i 番目の要素 elem-result は、 各引数の i 番目の要素 elem-0, ..., elem-n に対して、 elem-result = (func elem-0 ... elem-n) となっています。
> (let* ((x (list 0 1 2 3 4 5))
         (y (list 'a 'b 'c 'd 'e 'f))
         (z (map square x)))
    (map list x y z))
((0 a 0) (1 b 1) (2 c 4) (3 d 9) (4 e 16) (5 f 25))
> 
詳しい情報はこちら

99.10.7/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp