{-# LANGUAGE UndecidableInstances, AllowAmbiguousTypes, KindSignatures, TypeApplications, FlexibleInstances, ConstraintKinds #-}
import Data.Kind (Constraint, Type)
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
ICAgIHstIyBMQU5HVUFHRSBVbmRlY2lkYWJsZUluc3RhbmNlcywgQWxsb3dBbWJpZ3VvdXNUeXBlcywgS2luZFNpZ25hdHVyZXMsIFR5cGVBcHBsaWNhdGlvbnMsIEZsZXhpYmxlSW5zdGFuY2VzLCBDb25zdHJhaW50S2luZHMgIy19CiAgICAgCiAgICBpbXBvcnQgRGF0YS5LaW5kIChDb25zdHJhaW50LCBUeXBlKQogICAgIAogICAgbWFpbiA9IHByaW50ICJvayIKICAgICAKICAgIGNsYXNzIEEgKG0gOjogVHlwZSAtPiBUeXBlKQogICAgIAogICAgY2xhc3MgQiAobSA6OiBUeXBlIC0+IFR5cGUpCiAgICAgCiAgICBpbnN0YW5jZSBBIG0gPT4gQiBtCiAgICAgCiAgICBkYXRhIEMgKGEgOjogVHlwZSkKICAgICAKICAgIGluc3RhbmNlIEEgQwogICAgIAogICAgZGF0YSBEIChhIDo6IFR5cGUpCiAgICAgCiAgICBpbnN0YW5jZSB7LSMgT1ZFUkxBUFBJTkcgIy19IEIgRAogICAgIAogICAgZGF0YSBFIChhIDo6IFR5cGUpCiAgICAKICAgIGltcGxpY2l0bHkgOjogYSA9PiAoKQogICAgaW1wbGljaXRseSA9ICgpCiAgICAgCiAgICB0ZXN0ID0gaW1wbGljaXRseSBAKEEgQykKICAgIHRlc3QxID0gaW1wbGljaXRseSBAKEIgQykKICAgIC0tdGVzdDIgPSBpbXBsaWNpdGx5IEAoQSBEKSAtLSBkb2Vzbid0IGNvbXBpbGUKICAgIHRlc3QzID0gaW1wbGljaXRseSBAKEIgRCkKICAgIC0tdGVzdDQgPSBpbXBsaWNpdGx5IEAoQSBFKSAtLSBkb2Vzbid0IGNvbXBpbGUKICAgIC0tdGVzdDUgPSBpbXBsaWNpdGx5IEAoQiBFKSAtLSBkb2Vzbid0IGNvbXBpbGU=