Может ли кто-нибудь объяснить, как работает foldl
?
Я понял, что, например, foldr (-) 0 [1,2,3]
производит (1 - (2 - (3 - 0))), тогда как foldl (-) 0 [1,2,3]
производит (((0 - 1) - 2) - 3), но у меня есть еще несколько вопросов:Как работает складной склад?
первым примером (длина списка с foldr/foldl):
foldr (\_ acc -> acc + 1) 0 [1,2,3,4,5]
производит 5, как ожидалось.
foldl (\_ acc -> acc + 1) 0 [1,2,3,4,5]
производит 6.: |
foldl (\_ acc -> acc + 1) 0 [2]
производит 3.: |
Как реагировать на эти приведенные примеры?второй пример:
foldr (:) [] [1,2,3,4]
производит [1,2,3,4] - не переживайте, ноfoldl (:) [] [1,2,3,4]
дает мне ошибку:Occurs check: cannot construct the infinite type: a ~ [a]
Что случилось с foldl?
Для 'foldl' вам нужно переключить порядок аргументов между' acc' и '_', потому что' foldr' логически помещает начальный аргумент в конец последовательности, а 'foldl' логически помещает его в начале. Это означает, что аккумулятор является первым (!) Аргументом функции сгибания для 'foldl' (и второго аргумента для' foldr'). Из-за этой ошибки ваш аккумулятор «начинает» на '1' для' foldl', а не '0'. Если вы измените список на '[" a "," b "," c "," d "," e "]', например, вы получите хорошую ошибку проверки типа в образце 'foldl'. – MicroVirus
Если вы попробуете 'foldl (\ _ acc -> acc + 1) 0 [0,0,0,0]', то, возможно, вы увидите свою ошибку. – pdexter
Спасибо, @MicroVirus! – pkenobi23