{-# LANGUAGE NoRankNTypes, NoRank2Types #-}
f :: a -> (a -> a) -> a
f x g = g x

f' :: a -> (forall b. b -> b) -> a
f' x g = g x

-- g :: a -> b -> (c -> c) -> (a, b)
-- g x y f = (f x, f y)
--
-- not possible (c is either a or b)

g' :: a -> b -> (forall c. c -> c) -> (a, b)
g' x y f = (f x, f y)

-- totally possible, with RankNTypes
