私は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'
を除き、それらのすべてを理解しています。
バイナリ関数をアキュムレータとリストの各要素に順番に適用し、すべてのリストを調べる必要があると私は理解しています。なぜこれは頭(または尾)に止まるのですか?
私は_
(アンダースコア)は「何でも」または「気にしない」ことを意味しますが、どのようにすべてのリストを通過するのでしょうか?
ハスケルの怠惰な評価が記事の「頭」をスピードアップしないだろうか? 'foldr1(\ x _ - > x)[1..10000000000000000]'はGHCiで実行するには点滅します。 –
遅延評価! – augustss