サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
akihiro4chawon.hatenadiary.org
比較モナドについて考察されている一連のエントリに感銘を受けて、私も比較について考えてみました。 比較モナド - terazzoの日記 続・比較モナド - terazzoの日記 続・続・比較モナド〜復讐編〜 - terazzoの日記 まず、考察対象として「比較結果」と「比較操作」に分けて考えます。比較結果というのは、比較後に返ってくる値(例:Java の Comparator の compare における 負・零・正)を言います。比較操作というのは、比較する関数(あるいは関数オブジェクト)自体(例:Java の Compartor 自体)を言います。 比較結果モノイド 比較結果というのは、2つの比較対象に対して、その片方が他方よりも「小さいのか」「等しいのか」「大きいのか」を示す値です。例えば、Perl の 比較演算子 <=> や Java の Comparator において、左辺が小さいこ
Scala を使って Haskell 風の記述をしている例を時々見かけるけれど、徹頭徹尾 Haskell になっている例はあまり見掛けない。アプリケーションロジックだけ見れば同じなんだけれど、実際の内部動作は全然違っていたりする。そして、パフォーマンスが致命的に劣っていたりすると、悲しくてやりきれない気持ちになる。Scala は、本当は出来る子なんですと。 そこで、Haskell っぽい記述に耐えうる Scala Library を整備していこうと思う。 循環無限リストの整備 Haskell の無限リストのつもりで Scala の Stream を使うと、こんな落とし穴が待ち受けている。 例えば、無限リストの第1000000*1000番目が欲しいとき、Haskellならば、メモリ不足にはならないんだけれど、 Prelude> repeat 42 !! (1000000*1000) 42Sc
scala の parallel collection は、普通の collection を使うように使っているだけで、並列計算の恩恵を受けられる場合も多いのですが、そうではない場合も多いです。 その典型例が、ソートです。実は、並列のソートは、まだ実装されていません。 じゃあ、自分で実装すればいいのか、というと、これは半分正しくて半分間違いです。 どういう事かというと、シングルスレッドの java.util.Arrays.sort がとても高速なので、これより速いソートを自前で実装するのは難しいのです。Arrays.sort が速いのは、単にアルゴリズムだけの問題ではありません。自分で Array の整列処理を書くとすると、当然、配列の要素に添字でアクセスしますよね。すると、JVMは配列の範囲内かどうかをチェックしますよね。このオーバヘッドがあるために、java.util.Arrays.s
groovy 1.8 では、memoize によってクロージャのメモ化が出来るようになったけれど、scala だってできるもん、という負け惜しみエントリ。 普通の自動メモ化 サクっと作ったものを(1〜5引数対応)をGistに上げたので簡単に紹介。 実装のポイントは単純で、下記の通り。 // 1変数関数をメモ化する(2変数以上は tupled/untupledで対応) def memoize[ArgT, RetT](f: ArgT => RetT): ArgT => RetT = { val memo = scala.collection.mutable.Map.empty[ArgT, RetT] arg => memo.getOrElseUpdate(arg, f(arg)) } こんな風にして使う。 object Main extends Application { val fib: I
このページを最初にブックマークしてみませんか?
『akihiro4chawonの日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く