Таким образом, используя интуицию, которая foldr
сворачивает список справа (что не является рекурсивным определением), вы получаете следующее в простом случае:
foldr (+) 1 [2,3,4]
foldr (+) (4 + 1) [2,3]
foldr (+) (3 + 4 + 1) [2]
foldr (+) (2 + 3 + 4 + 1) []
(2 + 3 + 4 + 1)
10
Давайте сделаем то же самое в вашем примереи с учетом начального элемента repeat [] == [[],[],[],[], …]
foldr (zipWith (:)) ([[],[],[],[], ...]) [[1,2,3],[4,5,6],[7,8,9,10]]
foldr (zipWith (:)) (zipWith (:) [7,8,9,10] [[],[],[],[], ...]) [[1,2,3],[4,5,6]]
подождите мин.Давайте разработаем zipWith (:) [7,8,9,10] [[],[],[],[], ...]
zipWith (:) [7,8,9,10] [[],[],[],[], ...] -- apply the funciton (:) pairwise
[7:[], 8:[], 9:[], 10:[]] -- we get rid of the infinite list at this point.
[[7],[8],[9],[10]]
Отсюда мы можем легко следовать остальной части кода
foldr (zipWith (:)) ([[],[],[],[], ...]) [[1,2,3],[4,5,6],[7,8,9,10]]
foldr (zipWith (:)) (zipWith (:) [7,8,9,10] [[],[],[],[], ...]) [[1,2,3],[4,5,6]]
foldr (zipWith (:)) ([[7],[8],[9],[10]]) [[1,2,3],[4,5,6]]
foldr (zipWith (:)) (zipWith (:) [4,5,6] [[7],[8],[9],[10]]) [[1,2,3]]
foldr (zipWith (:)) (zipWith (:) [1,2,3] [[4:7],[5:8],[6:9]) []
zipWith (:) [1,2,3] [[4:7],[5:8],[6:9]
[[1,4,7],[2,5,8],[3,6,9]]
Обратите внимание, что это не правильное определение foldr
, и мы оцениваемрезультаты немедленно, а не лениво (как это делает haskell), но это только для понимания.