今日はちょっとコードの効率化の話をいったんお休みして、別の話を書きたいと思います。 以前に書いたControl.Arrow.loopでも実はさりげなく出ていたのですが、Haskellではletとwhere節の部分でちょっと変わったことができます。 Control.Arrow.loopの定義を見てみます: instance ArrowLoop (->) where loop f b = c where (c,d) = f (b,d) ちょっと不思議な関数定義なわけなんですが、特に変わっている部分があります。…それは変数dの宣言部分です。 (c,d) = f (b,d) loopの説明によると、これの影響で変数dは再帰の全ての段にわたって同じインスタンスが参照されているということらしいです。つまり、whereとletでは定義内での変数の再帰的参照が許されているようです。 おかげで、こんなことも