{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE ImpredicativeTypes #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE UndecidableInstances #-} module T14863 where data Dict c where Dict :: c => Dict c class (a => b) => Implies a b instance (a => b) => Implies a b uncurryCImpredic1 :: forall a b c. Implies a (b => c) => Dict (Implies (a, b) c) uncurryCImpredic1 = Dict uncurryCImpredic2 :: forall a b c. a => Implies b c => Dict (Implies (a, b) c) uncurryCImpredic2 = Dict uncurryC1 :: forall a b c. (a => b => c) => Dict (Implies (a, b) c) uncurryC1 = Dict uncurryC2 :: forall a b c. Implies a (Implies b c) => Dict (Implies (a, b) c) uncurryC2 = Dict