foldlに無限リスト?

無限リストに foldl を適用すると停止しないと言うのを前に書いたが、なぜ停止しないのだろうか。

なぜ停止しないのか

foldl の定義はこうなっている。

foldl f z0 xs0 = lgo z0 xs0
  where
    lgo z []     =  z
    lgo z (x:xs) = lgo (f z x) xs

f を(&&) とした場合。lgo (f z x) xs で z が False の場合 x の評価はされないが、xs は評価する必要がある。無限リストであれば xs は当然無限に続くので、lgo の基底部に達することはない。

じゃあ

こういう無限リストがあった場合に、

(…((True && True) && True)… && False)

こんな関数を使えば

(&&&) :: Bool -> Bool -> Bool
_ &&& False = False
x &&& True  = x

停止できるんじゃないかと思った。

が、無限リストの末尾の要素を取り出せないのでダメだよね。