Несколько сгибов за один проход с использованием универсальной функции кортежа

Как я могу написать функцию, которая принимает набор функций типаai -> b -> ai и возвращает функцию, которая принимает кортеж элементов типаai, один элемент типаbи объединяет каждый из элементов в новый кортежai:

То есть подпись должна быть похожа

f :: (a1 -> b -> a1, a2 -> b -> a2, ... , an -> b -> an) -> 
     (a1, a2, ... , an) -> 
     b -> 
     (a1, a2, ... , an)

Такой что:

f (min, max, (+), (*)) (1,2,3,4) 5 = (1, 5, 8, 20) 

Дело в том, чтобы я мог написать:

foldlMult' t = foldl' (f t)

А затем сделать что-то вроде:

foldlMult' (min, max, (+), (*)) (head x, head x, 0, 0) x 

сделать несколько сгибов за один проход. Расширения GHC в порядке.

Ответы на вопрос(2)

Ваш ответ на вопрос