惑星からの逃走線

読書記録や研究上で思いついたこと、日々の雑感など。

Haskell に手を染める;社会シミュレーション関連の視点から雑感

 文系とも理系ともつかぬ中途半端な分際で、あろうことか haskell に手を出してしまった。

 で、haskell の(入門の)*1023+入門をした身として、多少気になった点をいくつか。個人的には社会シミュレーション関連とも絡めて書きたい。

 

・副作用と参照透過性

 副作用とは、コンピュータに内部状態があり、それが時間等により変化し、ためにファンクションなどの結果が一意でなくなること(と理解している)、他方の参照透過性は内部状態を持たず、関数の結果は引数さえ同じなら必ず一意に決定される(と理解している、たぶん)。さて、一見して社会シミュレーションのような用途に供するとき、あきらかに副作用があった方が現実に即しているように思われる。人間には(もっといえば生物一般には)、明らかにかなり複雑な内部状態があるからだ。さらに、参照透過性があるとかなり乱数などが扱いにくくなる印象を持った。つまりは、仮にシミュレーションを haskell で組むとすれば決定論的なものがベースになってしまう(無論、実際にはアクションという概念を導入することで乱数なども取り扱えるようだが、ちょっと面倒なのはたしか)。これは、かなりのディスアドバンテージであるように思えた。

 

・遅延評価

 遅延評価とは、「必要になるまで計算しない」ということ。とだけ述べると、どうということはなさそうだが、実はこちらはかなり強力で、たとえば haskell では「要素数無限個のリスト」というトンでもないものが作れたりする。無論、本当にメモリを無限に確保したわけではなく、たとえば「要素数無限で各々の要素は"1"の繰り返しのリスト」を作ってそれの三億番目の要素にアクセスすれば、「ああ、これはずっと1を繰りかしているから三億番目も1だね」といって1を返す(非常に適当な理解。実際にGHCがどう処理しているかは知らないが、まあこんなところであろうと想像している)。また、これは遅延評価の範疇に入らないかもしれないが、リスト型にはどんどん要素を付加できる。これはかなり便利ではないかと感じた。要は、文字(長期の外部記憶媒体)を有する社会では当然、非常に古いログにもアクセスできる。これをたとえばCなどで再現しようとすれば、最初に猛烈な量のメモリを確保する必要があるが、しかしスタックオーバーフローになることが多い気がする。その点、haskell ならば簡単にリストへ要素を追加できる。

 

再帰

 再帰は、プログラマの人には釈迦に説法だろうが、一応解説すると、ある関数 func n があるとして、その定義を if func 1 then (hoge) else func n-1 みたいな感じで書くこと(伝わっているだろうか、この言語……)である。さて、haskell には for 構文がないので、繰り返し処理はだいたい再帰で書くようである。まだ実装できていないが、実はこの記法は社会における「メタ」な現象を書けないだろうか、と思っていたりする。つまり、ゲーム理論等で相手の戦略を読むとき、メタな視点があり、かつ相手にもメタ視点があると予想できれば囚人のジレンマゲームでも協力可能性が出てきたりするわけだが、そういうのを書ければ面白いと思う。ただ、再帰構文自体はどうもCとかでも可能っぽいが……。

 

 と、つらつら書いてきたが、haskell は「上手く使えれば使える」という凡百な結論である。ただ、副作用を扱いづらいのだけはちょっとなー、という感じ。遅延評価ができるオブジェクト指向言語とかあれば、かなり良さそうなのだが……。

 なお、私自身はプログラミング全般に関してド素人であることを書き添えておく。