do文と遅延評価
ようやくStateモナドとIOモナドの同居ができるようになりました。(モナド変換子)
それとは全然関係ないですが、途中、Boolを内包するモナドを変数に束縛してb1 || b2という論理式を使い、b1が真ならb2は評価されないと思い込んだらはまりました。
-- ハマる do b1 <- hogehoge b2 <- hegohego return (b1 || b2)
文の順序通り、ちゃんと展開するようです。で、hegohegoが再帰だったりすると、無限に展開し続けてスタックオーバフロー。戦略に遅延評価は関係ないのか。でも、hogehoge || hegohegoと書けないから何も考えないとこうしてしまうのだ〜!
if文を使って以下のように書いたら無事解決。
do b1 <- hogehoge if b1 then return True else hegohego
便利なシンタックスシュガーを見落としているのか、こんなものなのか。ああ、四角い「車輪」の自転車にうまく乗れなくて苦労しているとしか思えない。
関数型の面白さはわかったし、そろそろ、OCamlに乗り換えるかな。Mac用の新しい処理系があれば、Cleanが覚えるのが早そうなだけど、開発が止まっちゃってるかな。