{-# LANGUAGE ImplicitParams, RankNTypes #-} module ImplicitParams where data X = X c :: (?x :: X) => X c = ?x d :: (?x :: X, ?y :: X) => (X, X) d = (?x, ?y) f :: ((?x :: X) => a) -> a f a = let ?x = X in a