2006-05-21
■ リストのリスト 
リストのリストが与えられ、内側のリストの要素を足し合わせたリストを得る。
(define data '((1 2 3) (4 5 6) (7 8 9))) (map (lambda (ns) (fold + 0 ns)) data) ;=> (6 15 24)
追記:sumimさんからapplyとcutを使った解を教えていただきました。ああ、またapplyに発想が及ばなかったか(^_^;
cutは「部分適用」用の特殊形式なのですね。
(define data '((1 2 3) (4 5 6) (7 8 9))) (map (lambda (ns) (apply + ns)) data) ;=> (6 15 24) (map (cut apply + <>) data) ;=> (6 15 24)
追記:二次元配列の要素を縦方向に足すを実現します。
zipをapplyして、+をapplyします。
(use srfi-1) (define data '((1 2 3) (4 5 6) (7 8 9))) (map (lambda (ns) (apply + ns)) (apply zip data)) ;=> (12 15 18) (map (cut apply + <>) (apply zip data)) ;=> (12 15 18)
追記:こういう解答はどうだろうか。mapは複数リストを与えられるとまさに「縦読み」的な動作をすることを利用。
(define data '((1 2 3) (4 5 6) (7 8 9))) (apply map (cons + data)) ;=> (12 15 18)
追記:さらにさらにsumimさんから…
(define data '((1 2 3) (4 5 6) (7 8 9))) (apply map + data) ;=> (12 15 18)
すごーい。
トラックバック - http://sicp.g.hatena.ne.jp/hyuki/20060521
(map (lambda (ns) (apply + ns)) data)
もしくは
(map (cut apply + <>) data)
私は、「zipをapplyして、+をapply」で満足してしまっていました。(^_^;)
(apply map + data)
というのを思いつきました。