LINQ is Monads. リンクはモナド

nsharp さんに教えてもらったビデオを見てみました。ごちゃごちゃしたメモだけどもう眠いのでそのまま書き残しておきます。

http://channel9.msdn.com/Showpost.aspx?postid=358968

「LINQなんてのは、実装は適用連鎖ですが、根底にある発想は関数合成の方だったりします。」って言葉がとても気になったので。


ヒゲと帽子が似合うって話はおいといてw
関数の合成、圏論のモノイド、関数合成がモノイドを成すこと、そしてモナドを説明してくれるビデオ。でも、英語聞き取るのが難しいorz
型 A を取って同じ型 A を返す(集合 A から A への)関数全体は、関数合成、恒等関数 id (Iコンビネータですね)に関してモノイドを成す、っていう定番のお話。そして、関数合成とモナドの「>>=(bind、束縛)」は同じように「くっつけるもの」だって言ってるようです。モノイドとモナドの関係についてはよくわかりませんでした(早口でなんか言ってる)。モナドもモノイドって言ってるのかな?

LINQ is Monads. って言葉がとても印象的。「オブジェクト、SQLXML」はデータモデルが全然違うのに LINQ が同じように書けるのは、これらをモナドとして扱っているからだそうな。そういうことだったのか!

もうひとつ、bind is SelectMany. がとても気になったので、ビデオにはないけどちょっとやってみる。

SelectMany はこう。

public static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector);

bind はこう。普通は b c を a b、M も小文字で書くけどビデオにあわせました。

(>>=) :: M b -> (b -> M c) -> M c

ここで、TSource を b, TResult を c, IEnumerable を M と置き換えて、関数型っぽく書いてみます。

SelectMany : M b -> (b -> M c) -> M c

おおおお!!ピッタリ一致!SelectMany って >>= だったのか!
ふつケルに書いてあった、モナドが床下配線って意味が LINQ を通してちょっとわかってきた感じ。



以下、ごちゃごちゃしたメモ。

ほかに印象に残った言葉 : 関数もデータ。(モノイドで)シンプルな関数を組み合わせて、複雑なものを構成できる(シンプルなものを組み合わせて複雑なものを作るってのは、確かに LINQ関数型言語の重要な性質ですね)。時計を例にしたモノイドの説明。unit は 12。

モナド:
f : a -> M a (注: f は関数ね)
タイプコンストラクタがつく。型 a を取って M a 型にして返す。

\a -> (f a) >>= \a -> (g a)
\a ->  Ma        a ->  Ma

M はどこかで何かする何か。IO だったりデータベースだったり…とにかく何か。それは問わない。
LINQ is monads. エリックメイアーさんがとても注意深くデザインしてある。モナド偽装。

>>= はモナドの合成演算子

疑問:モナド則はモノイドのメタルールを満たすようにデザインしてあるってこと?

return : a -> M a
return が unit ?
bind は結合則を満たす。

LINQ: M a = IEnumerable<a>