{-# LANGUAGE ImpredicativeTypes #-} module M where ($@) :: (a -> b) -> a -> b f $@ x = f x type ShowIsh = (forall a. a -> (a -> String) -> String) foo1 :: (ShowIsh -> r) -> ShowIsh -> r foo1 f x = f $@ x