クラスの二つの顔

マリオカートWii (「Wiiハンドル」×1同梱)

マリオカートWii (「Wiiハンドル」×1同梱)

マリオカートWii が楽しすぎて日記どころじゃない生活になってますがたまにはエントリをw
wifi対戦のできがよすぎです。神ゲーです。いい年して指が痛くなるまで遊んでますw 世界トップの走りを見ることができるのもまたいい!超おすすめ。ハンドルは初心者用に見えて実は難しい罠に注意(^^;

本題。
クラスには2種類あります。値を表すクラスと、ライブラリ的なクラス。

「値を表すクラス」という言葉は「Equals() と演算子 == のオーバーロードに関するガイドライン」で知った言葉です。同値関係や順序関係を持つクラスは値を表すクラスでしか意味がないでしょう。

もう一方はWebClientみたいなライブラリのようなクラス。値も持ってたりしますが、値を表すというよりはライブラリの設定値を保持してるといったところです。

名著と云われる オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング) を見てみると、これらを「型としてのクラス」と「モジュールとしてのクラス」と分類してました。オブジェクト指向のクラスという仕組みがこれらを併合したと。総称性は「型のパターン」である、ともあります。んー、これはマリオカート脳にもビキビキと刺激が来る言葉です。同値関係や順序関係は C# ではジェネリクスで表現されてますね。これが型のパターンであると。ふむ!閑話休題

一つに併合してしまったので、値を表しつつもそれを操作するライブラリも含めて一つのクラスにできたり、ライブラリ的であっても値も持っていたり(リエントラントじゃない形でならCのライブラリでもできてたことだけど)と、両方の便利なところをクラスで表現できるってことでしょうかね。
冒頭では2種類とすっぱりわけてしまったけど、その中間になだらかにハイブリッドなクラスもありっぽいですね。GUIのコントロール部品なんかは中間タイプと言えそうですし。このあたりはもうちょっと読み進めてみます。

ずーっともやもやしてた疑問を考えたり調べたりしているうちに、型とクラスの違いが一つわかった感じです。

PageDefrag

ブクマしただけじゃもったいない気がしたのでこちらにメモ。

http://www.microsoft.com/technet/technetmag/issues/2007/09/UtilitySpotlight/default.aspx?loc=jp/

ページファイルやレジストリハイブ等々、ロックされてて普通じゃデフラグできないファイルをデフラグする Sysinternals のツール(の日本語での説明)。これはイイ!

Y はまわる

今回の Y ブームの発端が id:taguo さんで、さらにそのきっかけとなった一部が自分のエントリだったようです。今回のブームでλ計算をちょこっと勉強してみたので、これぞまさに再帰ですね!
飽きたと言っておきながらプチ数学ブームは、人物史として形を変えて続いていたり。

Y あたりの話は、数理論理学や数学基礎論に属するようです。集合論の矛盾にはじまり、ヒルベルト(ヒルベルト・プログラム)、ゲーデル(不完全性定理)、ノイマン(あまり関係ないけど)、アロンゾ・チャーチ(ラムダ計算)、チューリング(ラムダ計算)、クリーネ(正規表現の発明者)、ハスケルといった天才たちが関わっています。それぞれ wikipedia で調べるとおもしろいです。ゲーデルの人生に涙したり、ノイマンがコンピュータより計算が速いのかよ!とか。

プログラム言語 Haskell の名前の由来となっているハスケルカリーさんが研究していたのが組合せ論理(combinatory logic)というもので、チャーチのラムダ計算ととても似ているものです。コンビネーターってのはここから来た名前みたいですね。数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語 って本が気になります。近所の図書館にあるようなので、今度読んでみるかも。

というキーワードだけのたいした内容のないエントリーでトラバして、リンクも再帰させておきますw

λ計算で 1+2

すっかり飽きる前にλ計算してみます。お題は 1+2 が 3 になるかどうか。
チャーチ数と足し算の定義はwikipediaのものを使います。

1 := λf x. f x
2 := λf x. f (f x)
3 := λf x. f (f (f x))

PLUS := λm n f x. m f (n f x)

PLUS 1 2 をβ変換(引数に変数を入れて計算すること)していった結果(正規形)が 3 になりますかどうか。
1 と 2 はα変換(変数名が重ならないように付け替えること)して、

1 := λg y. g y
2 := λh z. h (h z)

とします。式の意味は変わってません。
では、開始。

( λm n f x. m f (n f x) ) ( λg y. g y ) ( λh z. h (h z) )
→ ( λn f x. ( λg y. g y ) f (n f x) ) ( λh z. h (h z) )
→ ( λf x. ( λg y. g y ) f (( λh z. h (h z) ) f x) )
→ λf x. ( λy. f y ) (( λh z. h (h z) ) f x)
→ λf x. f (( λh z. h (h z) ) f x)
→ λf x. f (( λz. f (f z) ) x)
→ λf x. f ( f (f x) )

3 になった! 1+2 ができただけなのに、とてもうれしいw
ついでに、間違いないよね?とドキドキしてます(^^;
1+2 ごときでw

飽きてきた

λにはじまり、帰納的関数とかゲーデルとか集合とかプチ数学ブームしてました。でも、難しいことは理解できず、早くも飽きてきた…。

プチリンク遊び

Console.WriteLine(
  "siokoshou"
    .OrderBy( c => c )
    .Distinct()
    .Aggregate( "", ( s, c ) => s += c ) );
// hikosu

λの世界

λ計算ってなんなの?って気になってたんだけど、「計算とは何か」ってことを研究するための道具ってことなのかな?数学で扱う関数の要素を抽出して作られたものがλ計算だそうな。「計算とは何か」なんて考えたこともなかった…。
Yコンビネーターってなんなの?ってのは、λ計算で扱うλ式たった3つの規則からなる定義なのに、Yコンビネーターを使えば再帰(つまりループ)ができちゃった、これですべての再帰的な関数が書けるようになったスゲー!ってこと。普通にループや再帰が書けるプログラムの世界では特に使う必要はないかと。