私はlearnyouahaskell.comを読んでいて、現在折り目を調査しています。この本には、次のような例があります。
maximum' :: (Ord a) => [a] -> a
maximum' = foldr1 (\x acc -> if x > acc then x else acc)
reverse' :: [a] -> [a]
reverse' = foldl (\acc x -> x : acc) []
product' :: (Num a) => [a] -> a
product' = foldr1 (*)
filter' :: (a -> Bool) -> [a] -> [a]
filter' p = foldr (\x acc -> if p x then x : acc else acc) []
head' :: [a] -> a
head' = foldr1 (\x _ -> x)
last' :: [a] -> a
last' = foldl1 (\_ x -> x)
head'
とを除くすべてを理解していますtail'
。
バイナリ関数をアキュムレータとリスト内の各要素に順番に適用し、すべてのリストを処理する必要があることを理解しています。なぜこれは頭(または尾)で止まるのですか?
_
(アンダースコア)が「何でも」または「気にしない」を意味することは理解していますが、それがすべてのリストを通過するのをどのように停止しますか?