Haskell の and , or は最後まで比較する


src/GHC-List.html#and

List の中の論理値が全て True であるかどうかチェックするには、Falseが出現した時点で成立しない。ここでチェックをやめてもいいのだけれど Haskell は fold を使っているので最後までチェックしている。

Special folds という分類があって、and ,or 以外にも concat, concatMap, any, all, sum, product, maximum ,minimum が定義されている。


Prelude> and [True,True,True]
True
Prelude> and [True,True,False]
False
Prelude> foldr (&&) True [True,True,True]
True
Prelude> foldr (&&) True [True,True,False]
False
Prelude> foldl (&&) True [True,True,False]
False
Prelude> foldl (&&) True [True,True,True]
True

Prelude> or [False,False,False]
False
Prelude> or [False,False,True]
True
Prelude> foldl (||) True [True,True,True]
True
Prelude> foldl (||) True [False,False,True]
True
Prelude> foldl (||) True [False,False,False]
True