. ▁Second , ▁in ▁order ▁to ▁get ▁unique ▁best ▁solutions ▁the ▁type ▁system ▁must ▁allow ▁b ivari ant ▁parameters ▁( which ▁are ▁simultaneously ▁co - ▁and ▁cont rav ari ant ). ▁And ▁finally , ▁the ▁variance ▁of ▁type ▁parameters ▁should ▁arg u ably ▁be ▁a ▁deliber ate ▁choice ▁by ▁the ▁designer ▁of ▁an ▁interface , ▁not ▁something ▁that ▁just ▁happens . ▁ ▁For ▁these ▁reasons ▁most ▁languages ▁do ▁very ▁little ▁variance ▁inference . ▁C # ▁and ▁Scala ▁do ▁not ▁infer ▁any ▁variance ▁annotations ▁at ▁all . ▁O C aml ▁can ▁infer ▁the ▁variance ▁of ▁parameter ized ▁concrete ▁dat at ypes , ▁but ▁the ▁programmer ▁must ▁explicitly ▁specify ▁the ▁variance ▁of ▁abstract ▁types ▁( inter faces ). ▁ ▁For ▁example , ▁consider ▁an ▁O C aml ▁dat atype ▁ ▁which ▁wra ps ▁a ▁function ▁ ▁type ▁(' a , ▁' b ) ▁t ▁= ▁T ▁of ▁(' a ▁-> ▁' b ) ▁▁ ▁The ▁compiler ▁will ▁automatically ▁infer ▁that ▁ ▁is ▁cont rav ari ant ▁in ▁the ▁first ▁parameter , ▁and ▁cov ari ant ▁in ▁the ▁second . ▁The ▁programmer ▁can ▁also ▁provide ▁explicit ▁annotations , ▁which ▁the ▁compiler ▁will ▁check ▁are ▁satisfied . ▁Thus ▁the ▁following ▁declaration ▁is ▁equivalent ▁to ▁the ▁previous ▁one : ▁ ▁type ▁(- ' a , ▁+ ' b ) ▁t ▁= ▁T ▁of ▁(' a ▁-> ▁' b ) ▁▁ ▁Exp licit ▁annotations ▁in ▁O C aml ▁become ▁useful ▁when ▁specifying ▁interfaces . ▁For ▁example , ▁the ▁standard ▁library ▁interface ▁ ▁for ▁association ▁tables ▁include ▁an ▁annotation ▁saying