しかし未だにパターンマッチの何が良いのかがまったくピーンと来てないので, kinaba さんあたりが「え? パターンマッチの良さも分からないんですか!? プログラマとして終わっていますね! それ以前に人間としてすでに終わっているのですけれど!」とか問い詰めてくれないかにゃー.
2010-02-24 01:03:58http://twitter.com/Cryolite/status/9531389696 さて、パターンマッチの良さのわからん人を効果的に罵倒する文言を…てのは冗談で、どうアピールするのが良いのかな。ええとまず、もろにツリー構造を扱うときに必須なのは明らかと信じるのですが。
2010-02-24 23:15:26ツリー使う時に無いと困るのは…いや、だって、これ http://bit.ly/qan16 を見た後に下のコードを書く気になりますか。部分特殊化 http://bit.ly/b9wj7g なしで全部メタ関数とSFINAEやstatic ifで書くと考えたら発狂しませんか、と。
2010-02-24 23:15:33てつがく的には、2つの側面があるかなーと思う。まず「ある内部構造を持っているかの検査と、持ってる場合にその構造へのアクセス手段を同時に提供する」。意味するところは二つ。検査とアクセスが1つになるので短い。検査してからでないとアクセスできないので"決して"不正アクセスできない安全さ
2010-02-24 23:15:56Boost.Optionalはif(opt)とチェックせずにfoo(*opt)とアクセスして死亡するコードが"書けてしまう"。switch(opt){case Maybe(x):foo(x);}と使えれば、それが絶対ない。"間違えることができないI/F"は僕が一番好きな物なのです
2010-02-24 23:16:03Optionalに限らず色々好きなデータをタグ付きで格納できるようにするのがいわゆるvariantなんだけど、C++やDのvariantは、せいぜい"typed union"であって、"tagged union"になってないのでパターンマッチの恩恵をフルに受けづらいかなーとは思う
2010-02-24 23:16:08要はvariant<int,int>とかできなくて困るという話なんですが http://bit.ly/a3Wv7B a|b のsemantic value が、aとbの型が同じだと潰れるとか何の役に立つのかさっぱりわからないのですよ…って、脱線してしまった。
2010-02-24 23:16:12てつがく的にもう1つの側面は、「値の構築とそこからのデータの取り出しに全然違う見た目の構文を使うのって美しくないなあ」。p=pair(12,34);って作ったペアからp.first、p.secondで値を取るってなんだか。pair(x,y)=p; って綺麗でいいじゃない!
2010-02-24 23:16:56昔からMLやHaskellにある古典的なパターンマッチは、ペアからは本当にfstとsndしか取り出せなくて隠蔽・カプセル化がない世界なんですけど、ScalaやF#や最近のHaskellは、色々アクセスメソッドを増やせるのと同様色々パターンをカスタマイズできてモダンで良いですよ。
2010-02-24 23:17:07Common Lisp の setf とかは、全然別物なんですけど、魂はだいたい同じだと思う。いや、なんか上手いこと説明すると全然別物ではなくて統一的な扱いができるかもしれないですけど。まあいいや。
2010-02-24 23:17:11