先々週~先週のScalaのお勉強は、sum。合算。
Seqコレクション(ListやArray・Vector)に入っている値を合算する方法を色々考えてみた。
Listに入っているクラスの値を合算するって、よくありそうなシチュエーションだからね。
その過程でListについてもメモ。
特にJavaのListとは、名前が同じだからといって同じイメージでいると、全く違うことにカルチャーショックを受けるので(笑)
ScalaのListは非常にシンプル。headとtail以外のデータは保持していない。
他のコレクション、例えばArrayやVectorなら要素数を保持しているが、Listには無い。
Listは不変コレクションなのでlazy valとかで要素数を保持できそうなものだが、その領域すら削っているのだろう。それに、sum・productといったメソッドもsizeと同じくlazy valに出来るとは思うけれど、そこまでやったらやり過ぎな気もするし。
話が逸れたが、Scala2.9で並列コレクションが使えるようになるというので、その合算も試してみた。当初は上手く動かなかった(と勘違いした)んだけど、Twitterで教わって、無事動かせた。
そうこうしている間にScala2.9.0RC1が出たようだが、2.9正式版が出てから改めて試してみたい。
(再帰関数を使って合算するならListは優位だが、最速はArrayのwhileループだった。ここに並列処理が加わると、並列Listは無いし、Arrayを並列Arrayにするにはコストがかかるし、どれがいいのか…)
あとは全く関係ないけど、噂のコンパイラプラグインをちょっと試してみた。
特定のメソッドを呼んでたら警告を出すとかは簡単に出来た。すげー(笑)
しかしこれを使って構造(前後関係)のチェックとかをやるのは、大変そうだ(苦笑)
※コメント投稿者のブログIDはブログ作成者のみに通知されます