Eще одно упражнение на списки, на этот раз чуть посложнее: Написать функцию, которая из вложенного списка делает плоский. Например, список типа

[1, [2, 3], 4, [5, [6, [7]]], 8] 

превращает в

[1, 2, 3, 4, 5, 6, 7, 8]

Решается передачей в reduce функции, которая по очереди цепляет элементы из первоначального списка к пустому списку. Если она встречает не примитивный элемент, а список, то рекурсивно цепляет его элементы уже к накопленному в аккумуляторе списку.

Получившийся список в конце нужно перевернуть, так как reduce комбинирует элементы начиная с первого, и последовательно цеплет последующие спереди.

В некоторых языках, кстати, предусмотрено две версии редьюса: foldl и foldr, которые начинают складывать список соответственно с левого или правого конца.