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が覚えるのが早そうなだけど、開発が止まっちゃってるかな。