我正在尝试编写一个可变参数函数组合函数。它基本上相当于 (.)
,只是第二个参数函数是可变参数的。这应该允许像下面这样的表达式:
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
有什么想法吗?这种情况是否可能?