{-# LANGUAGE UndecidableInstances, AllowAmbiguousTypes, KindSignatures, TypeApplications, FlexibleInstances, ConstraintKinds #-} import Data.Kind (Constraint, Type) main = print "ok" class A (m :: Type -> Type) class B (m :: Type -> Type) instance A m => B m data C (a :: Type) instance A C data D (a :: Type) instance {-# OVERLAPPING #-} B D data E (a :: Type) implicitly :: a => () implicitly = () test = implicitly @(A C) test1 = implicitly @(B C) --test2 = implicitly @(A D) -- doesn't compile test3 = implicitly @(B D) --test4 = implicitly @(A E) -- doesn't compile --test5 = implicitly @(B E) -- doesn't compile