表現媒体を変えると思考が整理される

モンテカルロ木探索のコードをPythonで書いていて、結局のところめんどくさいバグを発生させないためにはゲーム盤面の情報を持っているオブジェクトを破壊的に変更しないことが重要なのだと気づいた。

もう一つ気づいたことは「人間が盤面を見て手を入力する」のと「コンピュータが着手可能な手のリストを受け取って、選んで返す」のは思考の主体が異なるだけで本質的には同じことなのだからコード上でも同じようにするべきということだ。人間の入出力だけアドホックに作ってて複数の「判断」が抱き合わせになってたりしたけどそれはおかしい。

で、それをHaskellで書いていて「人間が盤面を見て手を入力する」と「コンピュータが着手可能な手のリストを受け取ってランダム選んで返す」の型を考えたら、これ両方ともIOモナドなんだな。[Hand] -> IO Handだ。

他にも色々「ああ、そうか」って体験があった。Pythonではゲームを初期化するのに引数のない関数create_gameがあったのだが、Haskellでは引数のない関数なんてものは存在しない。だってそれは常に同じ値を返すわけだから、その値を「ゲームの初期状態」として定義しておけばいいだけ。Python脳でゲームの状態を保存するのに辞書なんかを使って、しかも破壊的に書き換えてたりするとこれではダメだ。でもそもそも破壊的に書き換えるのがバグの元だ。