Вариадная функция компоновки?

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

map even . zipWith (+)

или просто

map even . zipWith

В настоящее время то, что я достиг, работает, если я добавлю IncoherentInstancesи требует неполиморфного экземпляра для функции первого аргумента.

{-# LANGUAGE FlexibleInstances, OverlappingInstances, MultiParamTypeClasses, 
FunctionalDependencies, UndecidableInstances, KindSignatures #-}

class Comp a b c d | c -> d where
    comp :: (a -> b) -> c -> d

instance Comp a b (a :: *) (b :: *) where
    comp f g = f g

instance Comp c d b e => Comp c d (a -> b) (a -> e) where
    comp f g = comp f . g

Есть идеи? Возможно ли это вообще?

]
13
задан Will Ness 16 June 2015 в 12:20
поделиться