Недостающие складки

Если вы хотите свернуть список, я вижу четыре способа сделать это.

Сложите справа от списка, с рекурсивным термином справа

foldrr ​​(-) 100 [1..10] = 1 - (2 - (3 - (4 - (5 - (6 - (7 - (8 - (9) (10 - (100)))))))))))) = 95

foldrr :: (a -> b -> b) -> b -> [a] -> b
foldrr step zero (x:xs) = step x (foldrr step zero xs)
foldrr _    zero []     = zero

Сложите справа от списка, с рекурсивным термином слева

foldrl (-) 100 [1..10] = ((((((((((((100) - 10) - 9) - 8) - 7) - 6) - 5) - 4) - 3) - 2) - 1 = 45

foldrl :: (a -> b -> a) -> a -> [b] -> a
foldrl step zero (x:xs) = step (foldrl step zero xs) x
foldrl _    zero []     = zero

Сверните слева от списка с рекурсивным термином справа

foldlr (-) 100 [1..10] = 10 - (9 - (8 - (7 - (6 - (5 - (4 - (3 - (2) (1 - (100))))))))))))) = 105

foldlr :: (a -> b -> b) -> b -> [a] -> b
foldlr step zero (x:xs) = foldlr step (step x zero) xs
foldlr _    zero []     = zero

Сверните слева от списка с рекурсивным термином слева

foldll (-) 100 [1..10] = ((((((((((((100) - 1) - 2) - 3) - 4) - 5) - 6) - 7) - 8) - 9) - 10 = 45

foldll :: (a -> b -> a) -> a -> [b] -> a
foldll step zero (x:xs) = foldll step (step zero x) xs
foldll _    zero []     = zero

Только две из этих складок превратились в Prelude как foldr а также foldl, Была ли какая-то причина, чтобы просто включить две складки, и почему эти две?

1 ответ

Решение

foldrl а также foldlr не добавляйте выразительной силы: они такие же, как и другие две складки, но с перевернутой функцией складывания.

foldrl f = foldr (flip f)
foldlr f = foldl (flip f)

-- Or this, if you prefer
foldrl = foldr . flip
foldlr = foldl . flip

Но это не так просто определить foldl с точки зрения foldrтак что предоставление их обоих полезно.

Другие вопросы по тегам