Первый ход не был бы таким.Проверьте тип свёртки
ghci>:t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
Просто для упрощения предположим, что t
будет []
.В этом случае, foldr:
Дайте мне функцию f
, которая принимает a
и b
и возвращает b
.Дайте мне начальный элемент и список a
.Я произведу b
.
Итак, он работает следующим образом: возьмите последний элемент списка и примените f к этому элементу, а начальное значение создаст b
.Возьмите новое последнее значение в списке и примените f к этому и предыдущему результату ... и т. Д.
В вашем случае, начальный элемент на самом деле является списком, и это грязно.Но проверьте это вычисление.Имейте в виду, что [1,2,3] используется в качестве начального значения, поэтому мы не «зацикливаемся» над ним
foldr (\x y -> x:y) [1,2,3] [4,5,6]
foldr (\x y -> x:y) 6:[1,2,3] [4,5]
foldr (\x y -> x:y) 5:6:[1,2,3] [4]
foldr (\x y -> x:y) 4:5:6:[1,2,3] []
Надеюсь, это поможет!