Eще одно упражнение на списки, на этот раз чуть посложнее: Написать функцию, которая из вложенного списка делает плоский. Например, список типа
[1, [2, 3], 4, [5, [6, [7]]], 8]
превращает в
[1, 2, 3, 4, 5, 6, 7, 8]
Решается передачей в reduce функции, которая по очереди цепляет элементы из первоначального списка к пустому списку. Если она встречает не примитивный элемент, а список, то рекурсивно цепляет его элементы уже к накопленному в аккумуляторе списку.
Получившийся список в конце нужно перевернуть, так как reduce комбинирует элементы начиная с первого, и последовательно цеплет последующие спереди.
В некоторых языках, кстати, предусмотрено две версии редьюса: foldl и foldr, которые начинают складывать список соответственно с левого или правого конца.