オブジェクト使うと便利なこと
オブジェクト指向はどうでも良いんですけど、オブジェクト自体は、一月に一回くらい使おう!っていう気分になることがあって、それは相互再帰する関数群でmutableなデータを引き回したいとき。
let rec parse_ident buffer = ... and parse_expr buffer = ... parse_ident buffer ... and parse_program buffer = ... parse_expr buffer ... let parse buffer = parse_program buffer
みたいな。bufferはstreamだと思ってください。破壊的にどんどん更新されていきます。で、こういう引数が何個も必要な場合があって、後で引数の数を増やしたり減らしたりしたくなってしまうと、そういう場合はちょっと途方にくれてしまいます。まあ、別にオブジェクトなんか使わなくても、↑の例だと、
let parse buffer = let rec parse_ident () = ... and parse_expr () = ... and parse_program () = ... in parse_program ()
みたいにして、引数の外にデータを出しちゃえば済むんですけど。これの何が嫌かって言うと、parse_*が全部外から見えなくなってしまうこと。別々にテストしたい場合があります。
そこで、グローバル変数を使えばあら便利。
そこで、オブジェクトを使えばあら便利。
class parser buffer = object (self) method parse_ident = ... method parse_expr = ... self#parse_ident ... method parse_program = ... self#parse_expr ... end
一個ずつテストするのも簡単ですし、bufferを一つずつ引数にしてあげる必要もなくなりました。やったぜ。
型システムの観点から言うと、オブジェクトにはstructural polymorphismとかpolymorphic method (higher-rank polymorphism)とかあるんですけど、まあそういうのが必要になるプログラミングはやったことがないですね。