Пакет uniplate обеспечивает функцию нисходящий в модуле Data.Generics.Uniplate.Data .Эта функция будет применять эту функцию везде, где совпадают типы, поэтому ее можно применять к спискам, кортежам, либо к большинству других типов данных.Некоторые примеры:
descend (\x -> 2*x) (1,2) == (2,4)
descend (\x -> 2*x) (1,"test",Just 2) == (2,"test",Just 4)
descend (\x -> 2*x) (1,2,3,4,5) == (2,4,6,8,10)
descend (\x -> 2*x) [1,2,3,4,5] == [2,4,6,8,10]