rightHaskellは美しい。ysもうちょっと綺麗に書けそうだが、こんなもんだろう。適当に乱数をソートしてみる。0n=100,000で比較。sortの弱点を突いてみる。ソート済みのリストを入力として与えてみる。[1..100000]で比較。sortはpivot選択すれば改良はできるけど、それでも理論上の最悪計算量はO(n^2)。sortを使用した方が安心な気がする。アルゴリズム2011年7月7日木曜日モナドを実装する今日はモナド実装にチャレンジ。モナドの機能は、contextualな値に関数を適用すること。functorやapplicativeも似たようなことを行うが、モナドのいいところは演算子のつなぎ目をきれいに書けるところ。モナドクラスのインスタンスにする型を定義する。後回しにする、という3つのcontextを持つ型を定義する。Eq)この型を利用するために以下の関数を定義する。NOさらに、この型をモナドインスタンスとして実装する。xこれを使うと、ややこしい制御フローがきれいに書ける。うるう年判定をするプログラム。if-elseが多い。Falseモナドを使うときれいに書ける。4)モナドは、制御フローを表に出さずに演算を繋げることができるデザインパターンと考えることもできる。見てのとおり制御フローをcomposableな要素として部品化することができ、if-else-break文のボイラープレート除去を行うことができる。条件が増えたら、新しいバインドで関数をつないであげれば、ifとかelseとかbreakとか書かなくてもよい。(composableうんぬんは、tanakhさんがつぶやいていた話です。高尚なお話だったと思いますが、自分が理解した限りだとこんな話。)functorやapplicativeと比べて、モナドがやたらと注目されている理由は、この3つの中で最も抽象度が高いからという理由もあるが、上のようなデザインパターンとして使用できるからというのが大きいのだと思う。最後に、今回実装したモナドがモナド則を満たしていることを確認する。適当に値を与えて確認する。applicativeを使って複数個のパターンを一気に確認する。