Несколько сгибов за один проход с использованием универсальной функции кортежа
Как я могу написать функцию, которая принимает набор функций типа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 в порядке.