▁that ▁the ▁map ▁type ▁constructor ▁is ▁cov ari ant ▁in ▁the ▁result ▁type . ▁ ▁module ▁type ▁S ▁= ▁▁▁▁ ▁sig ▁▁▁▁▁▁▁▁ ▁type ▁key ▁▁▁▁▁▁▁▁ ▁type ▁(+ ' a ) ▁t ▁▁▁▁▁▁▁▁ ▁val ▁empty : ▁' a ▁t ▁▁▁▁▁▁▁▁ ▁val ▁mem : ▁key ▁-> ▁' a ▁t ▁-> ▁bool ▁▁▁▁▁▁▁▁ ▁... ▁▁▁▁ ▁end ▁ ▁This ▁ens ures ▁that ▁e . g . ▁ ▁is ▁a ▁sub type ▁of ▁. ▁ ▁Use - site ▁variance ▁annotations ▁( w ild cards ) ▁ ▁One ▁draw back ▁of ▁the ▁declaration - site ▁approach ▁is ▁that ▁many ▁interface ▁types ▁must ▁be ▁made ▁invariant . ▁For ▁example , ▁we ▁saw ▁above ▁that ▁ ▁needed ▁to ▁be ▁invariant , ▁because ▁it ▁contained ▁both ▁ ▁and ▁. ▁In ▁order ▁to ▁expose ▁more ▁variance , ▁the ▁API ▁designer ▁could ▁provide ▁additional ▁interfaces ▁which ▁provide ▁subsets ▁of ▁the ▁available ▁methods ▁( e . g . ▁an ▁" insert - only ▁list " ▁which ▁only ▁provides ▁). ▁However ▁this ▁quickly ▁becomes ▁unw ield y . ▁ ▁Use - site ▁variance ▁annotations ▁aim ▁to ▁give ▁users ▁of ▁a ▁class ▁more ▁opportun ities ▁for ▁sub ty ping ▁without ▁requiring ▁the ▁designer ▁of ▁the ▁class ▁to ▁define ▁multiple ▁interfaces ▁with ▁different ▁variance . ▁Instead , ▁each ▁time ▁a ▁class ▁or ▁interface ▁is ▁used ▁in ▁a ▁type ▁declaration , ▁the ▁programmer ▁can ▁indicate ▁that ▁only ▁a ▁subset ▁of ▁the ▁methods ▁will ▁be ▁used . ▁In ▁effect , ▁each ▁definition ▁of ▁a ▁class ▁also ▁makes ▁available ▁interfaces ▁for ▁the ▁cov ari ant ▁and ▁cont rav ari ant ▁parts