diff --git a/src/Universum/VarArg.hs b/src/Universum/VarArg.hs index 18f7cae..de0ee80 100644 --- a/src/Universum/VarArg.hs +++ b/src/Universum/VarArg.hs @@ -19,7 +19,7 @@ module Universum.VarArg -- >>> import Data.List (zip5) -- | This type class allows to implement variadic composition operator. -class SuperComposition a b c | a b -> c where +class SuperComposition x y b r | x y b -> r where -- | Allows to apply function to result of another function with multiple -- arguments. -- @@ -45,16 +45,16 @@ class SuperComposition a b c | a b -> c where -- disappear due to very general inferred type. However, functions without type -- specification but with applied @INLINE@ pragma are fast again. -- - (...) :: a -> b -> c + (...) :: (x -> y) -> b -> r infixl 8 ... -instance {-# INCOHERENT #-} (a ~ c, r ~ b) => - SuperComposition (a -> b) c r where +instance {-# OVERLAPPABLE #-} (x ~ b, y ~ r) => + SuperComposition x y b r where f ... g = f g {-# INLINE (...) #-} -instance {-# INCOHERENT #-} (SuperComposition (a -> b) d r1, r ~ (c -> r1)) => - SuperComposition (a -> b) (c -> d) r where +instance {-# OVERLAPPING #-} (SuperComposition x y d r1, r ~ (c -> r1)) => + SuperComposition x y (c -> d) r where (f ... g) c = f ... g c {-# INLINE (...) #-}