結城浩のSICP日記 RSSフィード

2006-05-21

クォート クォート - 結城浩のSICP日記 を含むブックマーク

以下は、すべて等価。

''a                 ;=> 'a
'(quote a)          ;=> 'a
(quote 'a)          ;=> 'a
(quote (quote a))   ;=> 'a

リストのリスト リストのリスト - 結城浩のSICP日記 を含むブックマーク

リストのリストが与えられ、内側のリストの要素を足し合わせたリストを得る。

(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)

すごーい。

sumimsumim2006/05/21 01:33お邪魔します。Scheme の + は、任意個数の引数をとることができるのを利用して、apply でもいけそうですね。
(map (lambda (ns) (apply + ns)) data)
もしくは
(map (cut apply + <>) data)

sumimsumim2006/05/21 10:33すばらしいですね。>まさに「縦読み」的な動作
私は、「zipをapplyして、+をapply」で満足してしまっていました。(^_^;)

sumimsumim2006/05/21 10:45それをヒントにいただいて、apply の振る舞いを考え、
(apply map + data)
というのを思いつきました。

トラックバック - http://sicp.g.hatena.ne.jp/hyuki/20060521