Задача состоит в том, чтобы использовать только одну сквозную перегородку, используя foldr
или foldl
. Я использую это решение:Получить список элементов, расположенных в четных положениях исходного списка
evenOnly = fst . foldr (\x (y1, y2) -> (y2, x:y1)) ([],[])
Довольно хорошо для конечных списков. Если я попробую evenOnly [1,2..]
, у меня получится неудача. Я знаю, что это из-за приостановленных каценций, но как я могу разделить список или как передать дополнительную информацию о позициях списка или что-то в вычислениях, которые начинаются в конце списка?
Возможный дубликат поведения [foldl versus foldr с бесконечными списками] (http://stackoverflow.com/questions/3082324/foldl-versus-foldr-behavior-with-infinite-lists) – Bakuriu
Ну, 'foldr' работает на бесконечные списки ** при условии **, что выполняемая функция достаточно ленивая. Ясно объяснено в [этом ответе] (http://stackoverflow.com/a/3085516/510937). Цитата: «** Если **' f' ленив во втором аргументе - например, конструктор данных - результат будет поэтапно ленивым, причем каждый шаг складки вычисляется только тогда, когда требуется какая-то часть результата он оценивается ». Функция, которую вы используете, всегда использует свой второй аргумент, поэтому она ведет себя «как' foldl' ». – Bakuriu
Конечно. Я не имею в виду, что это единственное возможное решение с 'foldr'. Во всяком случае, на данный момент нельзя изобретать что-то более продвинутое. – BarbedWire