which ▁is ▁dynamic ▁typing ), ▁allowing ▁software ▁developers ▁to ▁choose ▁either ▁type ▁parad ig m ▁as ▁appropriate , ▁from ▁within ▁a ▁single ▁language . ▁In ▁particular , ▁grad ual ▁typing ▁uses ▁a ▁special ▁type ▁named ▁dynamic ▁to ▁represent ▁stat ically - unknown ▁types , ▁and ▁grad ual ▁typing ▁rep laces ▁the ▁notion ▁of ▁type ▁equality ▁with ▁a ▁new ▁relation ▁called ▁consist ency ▁that ▁rel ates ▁the ▁dynamic ▁type ▁to ▁every ▁other ▁type . ▁The ▁consist ency ▁relation ▁is ▁symmetric ▁but ▁not ▁trans itive . ▁ ▁Exp licit ▁or ▁implicit ▁declaration ▁and ▁inference ▁▁ ▁Many ▁static ▁type ▁systems , ▁such ▁as ▁those ▁of ▁C ▁and ▁Java , ▁require ▁type ▁declarations : ▁the ▁programmer ▁must ▁explicitly ▁associate ▁each ▁variable ▁with ▁a ▁specific ▁type . ▁O thers , ▁such ▁as ▁H askell ' s , ▁perform ▁type ▁inference : ▁the ▁compiler ▁draw s ▁conclus ions ▁about ▁the ▁types ▁of ▁variables ▁based ▁on ▁how ▁program mers ▁use ▁those ▁variables . ▁For ▁example , ▁given ▁a ▁function ▁ ▁that ▁adds ▁ ▁and ▁ ▁together , ▁the ▁compiler ▁can ▁infer ▁that ▁ ▁and ▁ ▁must ▁be ▁numbers — since ▁addition ▁is ▁only ▁defined ▁for ▁numbers . ▁Thus , ▁any ▁call ▁to ▁ ▁elsewhere ▁in ▁the ▁program ▁that ▁spec ifies ▁a ▁non - numeric ▁type ▁( such ▁as ▁a ▁string ▁or ▁list ) ▁as ▁an ▁argument ▁would ▁signal ▁an ▁error . ▁ ▁N umer ical ▁and ▁string ▁constants ▁and ▁expressions ▁in ▁code ▁can ▁and ▁often ▁do ▁imply ▁type ▁in ▁a ▁particular ▁context . ▁For ▁example , ▁an ▁expression ▁ ▁might