Составление цепочки функций с двумя аргументами

Итак, у меня есть список функций из двух аргументов типа [a -> a -> a]

Я хочу написать функция, которая берет список и объединяет их в цепочку функций, которая принимает длину + 1 аргумент, составленный слева. Например, если у меня есть [f, g, h] все типы [a -> a -> a] , мне нужно написать функцию, которая дает:

chain [f,g,h] = \a b c d -> f ( g ( h a b ) c ) d

Также, если это помогает, функции коммутативны по своим аргументам (т.е. fxy = fyx для всех xy ).

Я могу сделать это внутри понимания списка, учитывая, что я знаю количество рассматриваемых функций, это было бы почти точно так же, как определение. Меня озадачил переход от фиксированного числа функций к динамическому.

Вот что у меня есть на данный момент:

f xs = f' xs
    where
        f' []   = id
        f' (x:xs) = \z -> x (f' xs) z

Я думаю, что логика правильная, она просто не проверяет типы.

Заранее спасибо!

8
задан Stephen Diehl 8 December 2011 в 17:45
поделиться