これは、 について学習を開始するのに適した例ではありませんmap
。map
高階手続きは入力としてリストを取り、入力の各要素に関数が適用された同じ長さの別のリストを出力として返します。なぜこれが使用するための明確なケースではないのかを見てmap
ください 出力リストは入力よりも小さいです!
もちろん、それを行うことはできますが、それほどエレガントではなく、 の真の目的がわかりにくくなりますmap
:
(define (min lst1 lst2)
(if (zero? (first lst2)) ; if the first position in lst2 is zero
(rest lst2) ; then return the rest of it.
(min lst1 ; otherwise advance recursion
(map - lst2 lst1)))) ; ok, here `map` was useful
最後の行で何が起こっているかを理解するために、入力リストが上下に並んでいると想像してください。
'(2 4 6)
'(1 1 1)
次に、関数を要素ごとにmap
適用します。-
(- 2 1)
(- 4 1)
(- 6 1)
そして、各操作の結果が新しいリストに収集されます。
'(1 3 5)
これは の特殊なケースですmap
。関数の後に複数のリストがある場合、次のリストに進む前に各リストの最初の要素に関数を適用します。したがって、関数はリストと同じ数の引数を受け入れる必要があります。の通常のケースmap
は、単一のリスト内の各要素に関数を適用するだけですが、これは使用するのに適した場所lambda
です:
(map (lambda (x) (* x x))
'(1 2 3 4 5))
=> '(1 4 9 16 25)