reduceと多次元配列

In: Clojure

17 12月 2009

久々にのけぞった。

いやもうね map とか reduce とか強力すぎるからw

Clojureで多次元配列を扱う方法を探していたのですが
たとえば3×3×3の大きさの3次元配列:

(def lattice
     [[ [1  2  3]  [4  5  6]  [7  8  9]]
      [[10 11 12] [13 14 15] [16 17 18]]
      [[19 20 21] [22 23 24] [25 26 27]]])

の任意の要素を取り出したいとする。
lattice[z][y][x] のように簡単に要素を取り出したい。

いろいろ検索して見つけた答えは Clojureで書くとこうなります。

(reduce nth lattice [z y x])

うわー。やられた。おもいっきり盲点。

reduceは rubyでいうところの injectと覚えていたので

(1..6).inject(:+)  # = 1 + 2 + 3 + 4 + 5 + 6

のイメージが強すぎた。
だからapply と似たような使い方をしていたわけだ。

でもよく考えると本当は

((((((1) + 2) + 3) + 4) + 5) + 6)

なんだよね。
つまり最初の例だとこうなる。

(nth (nth (nth lattice z) y) x)

reduceの本質は再帰性にあったのだと再認識。

そう考えるといままで再帰にするだけで満足していたものが reduceで表記できるのもあったのかもしれないなー。

アルゴリズムの抽象度を高めていくのは楽しい工程ですね。
Lispネイティブと言えるほどに使いこなせるのはいつの日か。

blog comments powered by Disqus
Get Adobe Flash playerPlugin by wpburn.com wordpress themes

About this blog

私 manjilab のポータル的サイトになっております。日々気付いたこと、考えたこと、発表したいものを載せていきます。

Photostream

    Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Lisp indent 考察Tips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMateTips to use Clojure(Lisp) with TextMate