ู
ูุฐ ููุช ููุณ ุจุจุนูุฏ ุ ุชู
ุช ุชุฑุฌู
ุฉ ู
ูุงูุฉ ูู ูุจุฑ ุญูู ููููุฉ ุงุณุชุฎุฏุงู
 ุฃููุงุน ุงูุจูุงูุงุช ุงูุฌุจุฑูุฉ ููุชุฃูุฏ ู
ู ุฃู ุงูุญุงูุงุช ุบูุฑ ุงูุตุญูุญุฉ ูุง ูู
ูู ุงูุชุนุจูุฑ ุนููุง. ููุธุฑ ุงูููู
 ุฅูู ุทุฑููุฉ ุฃูุซุฑ ุนู
ูู
ูุฉ ููุงุจูุฉ ููุชูุณูุน ูุขู
ูุฉ ููุชุนุจูุฑ ุนู ู
ุง ูุง ูู
ูู ุงูุชุนุจูุฑ ุนูู ุ ูุณูู ูุณุงุนุฏูุง ูุงุณูู ูู ุฐูู.
ุจุงุฎุชุตุงุฑ ุ ุชูุงูุด ูุฐู ุงูู
ูุงูุฉ ุจุนุถ ุงูููุงูุงุช ู
ุน ุนููุงู ุจุฑูุฏู ูุนููุงู ุจุฑูุฏ ุฅููุชุฑููู ุ ููุฐูู ู
ุน ุงูุดุฑุท ุงูุฅุถุงูู ุงูุฐู ูุฌุจ ุฃู ูููู ููุงู ูุงุญุฏ ุนูู ุงูุฃูู ู
ู ูุฐู ุงูุนูุงููู. ููู ููุชุฑุญ ุงูุชุนุจูุฑ ุนู ูุฐุง ุงูุดุฑุท ุนูู ู
ุณุชูู ุงูููุนุ ููุชุฑุญ ูุชุงุจุฉ ุงูุนูุงููู ุนูู ุงููุญู ุงูุชุงูู:
type ContactInfo = | EmailOnly of EmailContactInfo | PostOnly of PostalContactInfo | EmailAndPost of EmailContactInfo * PostalContactInfo 
ู
ุง ุงูู
ุดุงูู ุงูุชู ูุนุงูู ู
ููุง ูุฐุง ุงูููุฌุ
ุฅู ุงูุฃู
ุฑ ุงูุฃูุซุฑ ูุถูุญูุง (ูุงูุฐู ุชู
ุช ู
ูุงุญุธุชู ุนุฏุฉ ู
ุฑุงุช ูู ุงูุชุนูููุงุช ุนูู ุชูู ุงูู
ูุงูุฉ) ูู ุฃู ูุฐุง ุงูููุฌ ุบูุฑ ูุงุจู ููุชุทููุฑ ุนูู ุงูุฅุทูุงู. ุชุฎูู ุฃูู ููุณ ูุฏููุง ููุนุงู ู
ู ุงูุนูุงููู ุ ูููู ูุฏููุง ุซูุงุซุฉ ุฃู ุฎู
ุณุฉ ุ ููุจุฏู ุฃู ุดุฑุท ุงูุตุญุฉ "ูุฌุจ ุฃู ูููู ููุงู ุฅู
ุง ุนููุงู ุจุฑูุฏู ุ ุฃู ุนููุงู ุจุฑูุฏ ุฅููุชุฑููู ูุนููุงู ู
ูุชุจ ุ ููุฌุจ ุฃูุง ูููู ููุงู ุนุฏุฉ ุนูุงููู ู
ู ููุณ ุงูููุน". ูู
ูู ูุฃููุฆู ุงูุฐูู ูุฑุบุจูู ูุชุงุจุฉ ุงูููุน ุงูู
ูุงุณุจ ูุชู
ุฑูู ููุงุฎุชุจุงุฑ ุงูุฐุงุชู. ุชุชู
ุซู ุงูู
ูู
ุฉ ุงูุชู ุชุญู
ู ุนูุงู
ุฉ ุงููุฌู
ุฉ ูู ุฅุนุงุฏุฉ ูุชุงุจุฉ ูุฐุง ุงูููุน ูู ุญุงูุฉ ุงุฎุชูุงุก ุงูุดุฑุท ุงูู
ุชุนูู ุจุบูุงุจ ุงูุชูุฑุงุฑุงุช ู
ู ุงูุงุฎุชุตุงุตุงุช.
ุดุงุฑู
ููู ุชุญู ูุฐู ุงูู
ุดููุฉุ ุฏุนููุง ูุญุงูู ุงูุชุฎูู. ุฃููุงู ูููู
 ุจุชุญููู ููุตู ูุฆุฉ ุงูุนููุงู (ุนูู ุณุจูู ุงูู
ุซุงู ุ ุงูุจุฑูุฏ / ุงูุจุฑูุฏ ุงูุฅููุชุฑููู / ุฑูู
 ุงูู
ูุชุจ ูู ุงูู
ูุชุจ) ูุงูู
ุญุชููุงุช ุงูู
ูุงุจูุฉ ููุฐู ุงููุฆุฉ:
 data AddrType = Post | Email | Office 
ูู ูููุฑ ูู ุงูู
ุญุชูู ุญุชู ุงูุขู ุ ูุฃูู ูุง ููุฌุฏ ุดูุก ุนูู ูู ุงูุดุฑูุท ุงูู
ุฑุฌุนูุฉ ูุตูุงุญูุฉ ูุงุฆู
ุฉ ุงูุนูุงููู.
ุฅุฐุง ุชุญูููุง ู
ู ุงูุญุงูุฉ ุงูู
ูุงุจูุฉ ูู ููุช ุชุดุบูู ุจุนุถ ู
ููุดุฆ ุจุนุถ ูุบุฉ OOP ุงูุนุงุฏูุฉ ุ ูุณููุชุจ ููุท ูุธููุฉ ู
ุซู
 valid :: [AddrType] -> Bool valid xs = let hasNoDups = nub xs == xs  
ูุณูู ูููู ุจุจุนุถ ุงูุฅุนุฏุงู
 ุฅุฐุง ุฃุนุงุฏ False .
ูู ูู
ูููุง ุจุฏูุงู ู
ู ุฐูู ุงูุชุญูู ู
ู ุญุงูุฉ ู
ู
ุงุซูุฉ ุจู
ุณุงุนุฏุฉ ุนุฏุงุฏ ููุช ุนูุฏ ุงูุชุฑุฌู
ุฉุ ุงุชุถุญ ุฃูู ูุนู
 ุ ูู
ูููุง ุ ุฅุฐุง ูุงู ูุธุงู
 ููุน ุงููุบุฉ ู
ุนุจุฑูุง ุจู
ุง ููู ุงูููุงูุฉ ุ ูุจููุฉ ุงูู
ูุงูุฉ ุณูุฎุชุงุฑ ูุฐุง ุงูููุฌ.
ููุง ุ ุณุชุณุงุนุฏูุง ุงูุฃููุงุน ุงูุชุงุจุนุฉ ูุซูุฑูุง ุ ูุจู
ุง ุฃู ุงูุทุฑููุฉ ุงูุฃูุซุฑ ู
ูุงุกู
ุฉ ููุชุงุจุฉ ุฑู
ุฒ ุชู
 ุงูุชุญูู ู
ูู ูู ูุงุณูู ูู ูุชุงุจุชู ูู Agde ุฃู Idris ุฃููุงู ุ ูุณูุบูุฑ ุฃุญุฐูุชูุง ูููุชุจ ูู Idris. ุจูุงุก ุฌู
ูุฉ idris ูุฑูุจ ุฌุฏูุง ู
ู Haskell: ุนูู ุณุจูู ุงูู
ุซุงู ุ ู
ุน ุงููุธููุฉ ุงูู
ุฐููุฑุฉ ุฃุนูุงู ุ ู
ุง ุนููู ุณูู ุชุบููุฑ ุงูุชูููุน ููููุงู:
 valid : List AddrType -> Bool 
ุชุฐูุฑ ุงูุขู ุฃูู ุจุงูุฅุถุงูุฉ ุฅูู ูุฆุงุช ุงูุนูุงููู ุ ูุญุชุงุฌ ุฃูุถูุง ุฅูู ู
ุญุชููุงุชูุง ุ ููุฑู
ุฒ ุฅูู ุงุนุชู
ุงุฏ ุงูุญููู ุนูู ูุฆุฉ ุงูุนููุงู ูู GADT:
 data AddrFields : AddrType -> Type where PostFields : (city : String) -> (street : String) -> AddrFields Post EmailFields : (email : String) -> AddrFields Email OfficeFields : (floor : Int) -> (desk : Nat) -> AddrFields Office 
ุจู
ุนูู ุ ุฅุฐุง ุชู
 AddrFields t ููู
ุฉ fields ุงูููุน AddrFields t ุ ูุฅููุง ูุนูู
 ุฃู t ูู ุจุนุถ AddrType AddrType ูุฃู fields ุชุญุชูู ุนูู ู
ุฌู
ูุนุฉ ู
ู ุงูุญููู ุงูู
ูุงุจูุฉ ููุฐู ุงููุฆุฉ ุงูู
ุญุฏุฏุฉ.
ุนู ูุฐุง ุงูู
ูุดูุฑูุฐุง ููุณ ุงูุชุฑู
ูุฒ ุงูุฃูุซุฑ ุฃู
ุงููุง ู
ู ุญูุซ ุงูููุน ุ ูุธุฑูุง ูุฃู GADT ูุง ูุฌุจ ุฃู ูููู ู
ุฏู
ุฌูุง ุ ูุณูููู ู
ู ุงูุฃุตุญ ุงูุฅุนูุงู ุนู ุซูุงุซุฉ ุฃููุงุน ุจูุงูุงุช ู
ููุตูุฉ OfficeFields ู OfficeFields ู OfficeFields ููุชุงุจุฉ ูุธููุฉ
 addrFields : AddrType -> Type addrFields Post = PostFields addrFields Email = EmailFields addrFields Office = OfficeFields 
ููู ูุฐู ูุชุงุจุฉ ูุซูุฑุฉ ููุบุงูุฉ ุ ูุงูุชู ูุง ุชุนุทู ูููู
ูุฐุฌ ุงูุฃููู ู
ูุณุจูุง ูุจูุฑูุง ุ ููู Haskell ููุฐุง ูุง ุชุฒุงู ููุงู ุขููุงุช ุฃูุซุฑ ุฅูุฌุงุฒูุง ูู
ู
ุชุนุฉ.
 ู
ุง ุงูุนููุงู ุงููุงู
ู ูู ูุฐุง ุงููู
ูุฐุฌุ ูุฐุง ุฒูุฌ ู
ู ูุฆุฉ ุงูุนููุงู ูุงูุญููู ุงูู
ูุงุจูุฉ:
 Addr : Type Addr = (t : AddrType ** AddrFields t) 
ุณูููู ู
ุญุจู ูุธุฑูุฉ ุงูููุน ุฃู ูุฐุง ููุน ุชุงุจุน ูุฌูุฏู: ุฅุฐุง ุชู
 ุฅุนุทุงุคูุง ุจุนุถ ุงูููู
ุฉ ู
ู ุงูููุน Addr ุ ููุฐุง ูุนูู ุฃู ููุงู ููู
ุฉ t ุงูููุน AddrType ูู
ุฌู
ูุนุฉ ู
ูุงุจูุฉ ู
ู ุญููู AddrFields t . ุจุทุจูุนุฉ ุงูุญุงู ุ ุชููู ุนูุงููู ูุฆุฉ ู
ุฎุชููุฉ ู
ู ููุณ ุงูููุน:
 someEmailAddr : Addr someEmailAddr = (Email ** EmailFields "that@feel.bro") someOfficeAddr : Addr someOfficeAddr = (Office ** OfficeFields (-2) 762) 
ุนูุงูุฉ ุนูู ุฐูู ุ ุฅุฐุง ุชู
 ู
ูุญ EmailFields Email ููุง ุ ูุฅู ูุฆุฉ ุงูุนููุงู ุงููุญูุฏุฉ ุงูู
ูุงุณุจุฉ ูู Email ุ ุญุชู ุชุชู
ูู ู
ู EmailFields ุ EmailFields ุงูู
ููุช ุจููุณู:
 someEmailAddr : Addr someEmailAddr = (_ ** EmailFields "that@feel.bro") someOfficeAddr : Addr someOfficeAddr = (_ ** OfficeFields (-2) 762) 
ููุชุจ ูุธููุฉ ู
ุณุงุนุฏุฉ ุชูุฏู
 ูุงุฆู
ุฉ ู
ูุงุธุฑุฉ ููุฆุงุช ุงูุนูุงููู ู
ู ูุงุฆู
ุฉ ุงูุนูุงููู ุ ููุนู
ู
ูุง ููุฑูุง ููุนู
ู ุนูู ู
ู
ุฑ ุชุนุณูู:
 types : Functor f => f Addr -> f AddrType types = map fst 
ููุง ุ ูุชุตุฑู ููุน Addr ุงููุฌูุฏู ู
ุซู ุฒูุฌูู ู
ุฃููููู: ุนูู ูุฌู ุงูุฎุตูุต ุ ูู
ููู ุฃู ุชุทูุจ ุงูู
ููู ุงูุฃูู AddrType (ู
ูู
ุฉ ุจุนูุงู
ุฉ ุงููุฌู
ุฉ: ูู
ุงุฐุง ูุง ูู
ูููู ุทูุจ ุงูู
ููู ุงูุซุงููุ).
ุงุฑูุน
ููุชูู ุงูุขู ุฅูู ุฌุฒุก ุฑุฆูุณู ู
ู ูุตุชูุง. ูุฐุง ุ ูุฏููุง List Addr ุจุนูุงููู List Addr ูุจุนุถ ุงูู
ุณูุฏุงุช valid : List AddrType -> Bool ุ ูุงูุชู ูุฑูุฏ ุถู
ุงู ุชูููุฐูุง ููุฐู ุงููุงุฆู
ุฉ ุนูู ู
ุณุชูู ุงูุฃููุงุน. ููู ูุฌู
ุนูู
ุ ุจุงูุทุจุน ุ ููุน ุขุฎุฑ!
 data ValidatedAddrList : List Addr -> Type where MkValidatedAddrList : (lst : List Addr) -> (prf : valid (types lst) = True) -> ValidatedAddrList lst 
ุงูุขู ุณูููู
 ุจุชุญููู ู
ุง ูุชุจูุงู ููุง.
data ValidatedAddrList : List Addr -> Type where ูุนูู ุฃู ุงูููุน ValidatedAddrList ู
ุนูู
ุงุชู ุ ูู ุงููุงูุน ุ ู
ู ุฎูุงู ูุงุฆู
ุฉ ุงูุนูุงููู.
ูููู ูุธุฑุฉ ุนูู ุชูููุน ู
ููุดุฆ MkValidatedAddrList ุงููุญูุฏ ู
ู ูุฐุง ุงูููุน: (lst : List Addr) -> (prf : valid (types lst) = True) -> ValidatedAddrList lst . ุฃู ุฃููุง ุชุฃุฎุฐ ุจุนุถ ูุงุฆู
ุฉ ุนูุงููู lst prf ุฃุฎุฑู ู
ู ุงูููุน prf valid (types lst) = True . ู
ุงุฐุง ูุนูู ูุฐุง ุงูููุนุ ูุนูู ุฐูู ุฃู ุงูููู
ุฉ ุงูู
ูุฌูุฏุฉ ุนูู ูุณุงุฑ = ุชุณุงูู ุงูููู
ุฉ ุนูู ูู
ูู = ุ ุฃู ุฃููุง valid (types lst) ุ ูู ุงููุงูุน ุ ูู True.
ููู ูุนู
ูุ ุงูุชูููุน = ูุดุจู (x : A) -> (y : B) -> Type . ูุฐุง ูุนูู ุฃู = ูุฃุฎุฐ ููู
ุชูู ุนุดูุงุฆูุชูู x ู y (ุฑุจู
ุง ุญุชู ู
ู ููุนูู ู
ุฎุชูููู A ู B ุ ู
ู
ุง ูุนูู ุฃู ุนุฏู
 ุงูู
ุณุงูุงุฉ ูู idris ุบูุฑ ู
ุชุฌุงูุณ ุ ูุฃูู ุบุงู
ุถ ุฅูู ุญุฏ ู
ุง ู
ู ูุฌูุฉ ูุธุฑ ูุธุฑูุฉ ุงูููุน ุ ูููู ูุฐุง ู
ูุถูุน ูู
ูุงูุดุฉ ุฃุฎุฑู). ุซู
 ู
ุง ูุฏู ุนูู ุงูู
ุณุงูุงุฉุ ูุจุณุจุจ ุญูููุฉ ุฃู ุงูู
ูุดุฆ ุงููุญูุฏ = - Refl ุจุชูููุน ููุงุฏ ูููู (x : A) -> x = x . ุฃู ุ ุฅุฐุง ูุงูุช ูุฏููุง ููู
ุฉ ู
ู ุงูููุน x = y ุ ูุฅููุง ูุนูู
 ุฃูู ุชู
 ุจูุงุคู ุจุงุณุชุฎุฏุงู
 Refl (ูุฃูู ูุง ููุฌุฏ Refl ุขุฎุฑูู) ุ ู
ู
ุง ูุนูู ุฃู x ุชุณุงูู y ุงููุงูุน.
ูุงุญุธ ุฃู ูุฐุง ูู ุงูุณุจุจ ูู Haskell ุณูู ูุชุธุงูุฑ ุฏุงุฆู
ูุง ูู ุฃุญุณู ุงูุฃุญูุงู ุจุฃููุง ูุซุจุช ุดูุฆูุง ุ ูุฃู Haskell ูุฏ ุญุฏุฏ ุฃู ูุณูู ุฃู ููุน ุ ูุฐูู ูุง ุชุนู
ู ุงูุญุฌุฉ ุงูู
ุฐููุฑุฉ ุฃุนูุงู ููุงู: ูุฃู x ุ y ู
ุตุทูุญ ู
ู ุงูููุน x = y ูู
ูู ุฅูุดุงุคู ุนุจุฑ undefined (ุฃู ู
ู ุฎูุงู ุงูุนูุฏูุฉ ุงููุงููุงุฆูุฉ ุ ูู ุฃูู ุจุดูู ุนุงู
 ูู ููุณู ู
ู ุญูุซ ูุธุฑูุฉ ุงูููุน).
ููุงุญุธ ุฃูุถูุง ุฃู ุงูู
ุณุงูุงุฉ ููุง ูุง ุชุนูู ุจู
ุนูู Haskell's Eq ุฃู ุฃู operator== ูู C ++ ุ ูููููุง ุฃูุซุฑ ุตุฑุงู
ุฉ ุฅูู ุญุฏ ูุจูุฑ: ุงููููููุฉ ุ ูุงูุชู ุ ุชุจุณูุทูุง ุ ุชุนูู ุฃู ุงูููู
ุชูู ููุง ููุณ ุงูุดูู . ููุฐุง ูุนูู ุฃู ุฎุฏุงุนู ุจุจุณุงุทุฉ ูุง ูุนู
ู. ููู ูุถุงูุง ุงูู
ุณุงูุงุฉ ุชูุฌุฐุจ ุชูููุฏูุง ุฅูู ู
ุงุฏุฉ ู
ููุตูุฉ.
ูุชุนุฒูุฒ ููู
ูุง ููู
ุณุงูุงุฉ ุ ููุชุจ ุงุฎุชุจุงุฑุงุช ุงููุญุฏุฉ ูููุธููุฉ valid :
 testPostValid : valid [Post] = True testPostValid = Refl testEmptyInvalid : valid [] = False testEmptyInvalid = Refl testDupsInvalid : valid [Post, Post] = False testDupsInvalid = Refl testPostEmailValid : valid [Post, Email] = True testPostEmailValid = Refl 
ูุฐู ุงูุงุฎุชุจุงุฑุงุช ุฌูุฏุฉ ู
ู ุญูุซ ุฃูู ูุง ุชุญุชุงุฌ ุญุชู ุฅูู ุชุดุบูููุง ุ ููููู ุฃู ูููู
 ุงูู
ุดุบู ุจูุญุตูุง. ูู ุงููุงูุน ุ ููุณุชุจุฏู True ุจู False ุ ุนูู ุณุจูู ุงูู
ุซุงู ุ ูู ุฃูููุง ููุฑู ู
ุง ุณูุญุฏุซ:
 testPostValid : valid [Post] = False testPostValid = Refl 
ููุณู
 Typsekher

ูู
ุง ูู ู
ุชููุน. ุนุธูู
ุชุจุณูุท
ุงูุขู ุฏุนููุง ุฅุนุงุฏุฉ ุจูุงุก ูุงุฆู
ุฉ ValidatedAddrList ููููุงู.
ุฃููุงู ุ ุฅู ูู
ุท ู
ูุงุฑูุฉ ููู
ุฉ ู
ุนููุฉ ู
ุน True ุดุงุฆุน ุชู
ุงู
ูุง ุ ูุฐูู ููุงู ููุน ุฎุงุต So ูู ุฅุฏุฑูุณ ููุฐุง: ูู
ููู ุฃู ุชุฃุฎุฐ So x ูู
ุฑุงุฏู ูู x = True . ููุตูุญ ุชุนุฑูู ValidatedAddrList :
 data ValidatedAddrList : List Addr -> Type where MkValidatedAddrList : (lst : List Addr) -> (prf : So (valid $ types lst)) -> ValidatedAddrList lst 
ุจุงูุฅุถุงูุฉ ุฅูู ุฐูู ุ So ูุฏูู ูุธููุฉ ู
ุณุงุนุฏุฉ ู
ูุงุฆู
ุฉ choose ุ ูุงูุชู ูู ุฌููุฑูุง ุชุฑูุน ุงูุชุญูู ุฅูู ู
ุณุชูู ุงูุฃููุงุน:
 > :doc choose Data.So.choose : (b : Bool) -> Either (So b) (So (not b)) Perform a case analysis on a Boolean, providing clients with a So proof 
ุณูููู ู
ู ุงูู
ููุฏ ููุง ุนูุฏู
ุง ููุชุจ ูุธุงุฆู ุชุนุฏูู ูุฐุง ุงูููุน.
ุซุงูููุง ุ ูู ุจุนุถ ุงูุฃุญูุงู (ุฎุงุตุฉ ูู ุงูุชุทููุฑ ุงูุชูุงุนูู) ูู
ูู prf ุงูุนุซูุฑ ุนูู ููู
ุฉ prf ุงูู
ูุงุณุจุฉ ุจู
ูุฑุฏูุง. ู
ู ุฃุฌู ุฃูู ูู ู
ุซู ูุฐู ุงูุญุงูุงุช ุ ูู
 ููู ู
ู ุงูุถุฑูุฑู ุจูุงุฆู ูุฏูููุง ุ ููุงู ุณูุฑ ูุญูู ู
ูุงุธุฑ:
 data ValidatedAddrList : List Addr -> Type where MkValidatedAddrList : (lst : List Addr) -> {auto prf : So (valid $ types lst)} -> ValidatedAddrList lst 
ุงูุฃููุงุณ ุงูู
ุชุนุฑุฌุฉ ุชุนูู ุฃู ูุฐู ุญุฌุฉ ุถู
ููุฉ ุจุฃู ุฅุฏุฑูุณ ุณูุญุงูู ุงูุงูุณุญุงุจ ู
ู ุงูุณูุงู ุ ููุนูู auto ุฃูู ุณูุญุงูู ุฃูุถูุง ุจูุงุกู ุจููุณู.
ุฅุฐู ู
ุงุฐุง ุชุนุทููุง ูุงุฆู
ุฉ ValidatedAddrList ุงูุฌุฏูุฏุฉ ูุฐูุ ููุนุทู ู
ุซู ูุฐู ุงูุณูุณูุฉ ู
ู ุงูุงุณุชุฏูุงู: val ููู
ุฉ ู
ู ุงูููุน ValidatedAddrList lst . ูุฐุง ูุนูู ุฃู lst ุนุจุงุฑุฉ ุนู ูุงุฆู
ุฉ ุนูุงููู ุ ุจุงูุฅุถุงูุฉ ุฅูู ุฐูู ุ ุชู
 ุฅูุดุงุก val ุจุงุณุชุฎุฏุงู
 ู
ููุดุฆ MkValidatedAddrList ุ ุงูุฐู ู
ุฑุฑูุง ุจู ูุฐุง lst ูููู
ุฉ prf ุฃุฎุฑู ู
ู ุงูููุน So (valid $ types lst) ุ ููู valid (types lst) = True ุชูุฑูุจูุง valid (types lst) = True . ูุญุชู ูุชู
ูู ู
ู ุจูุงุก prf ุ ูุญุชุงุฌ ุ ูู ุงููุงูุน ุ ูุฅุซุจุงุช ุฃู ูุฐู ุงูู
ุณุงูุงุฉ prf .
ูุงูุดูุก ุงูุฃุฌู
ู ูู ุฃู ูู ูุฐุง ูุชู
 ูุญุตู ุนู ุทุฑูู ุงูุทุจูุฉ. ูุนู
 ุ ูุฌุจ ุฃู ูุชู
 ุงูุชุญูู ู
ู ุงูุตูุงุญูุฉ ูู ููุช ุงูุชุดุบูู (ูุฃูู ูู
ูู ูุฑุงุกุฉ ุงูุนูุงููู ู
ู ู
ูู ุฃู ู
ู ุงูุดุจูุฉ) ุ ูููู ุงูุนุฏุงุฏ ูุถู
ู ุฃู ูุชู
 ูุฐุง ุงูุชุญูู: ุจุฏููู ุ ู
ู ุงูู
ุณุชุญูู ุฅูุดุงุก ValidatedAddrList . ุนูู ุงูุฃูู ูู ุงุฏุฑูุณ. ูู ูุงุณูู ุ ููุฃุณู.
ุฃุฏุฎู
ููุชุญูู ู
ู ุญุชู
ูุฉ ุงูุชุญูู ุ ุณูุญุงูู ูุชุงุจุฉ ูุธููุฉ ูุฅุถุงูุฉ ุนููุงู ุฅูู ุงููุงุฆู
ุฉ. ุงูู
ุญุงููุฉ ุงูุฃููู:
 insert : (addr : Addr) -> ValidatedAddrList lst -> ValidatedAddrList (addr :: lst) insert addr (MkValidatedAddrList lst) = MkValidatedAddrList (addr :: lst) 
ููุง ุ ุงูู
ุฏูู ุงูุฅู
ูุงุฆู ูุนุทู ุงูุฃุตุงุจุน (ุนูู ุงูุฑุบู
 ู
ู ุฃูู ุบูุฑ ูุงุจู ูููุฑุงุกุฉ ููุบุงูุฉ ุ ูุฅู ุชูููุฉ valid ู
ุนูุฏุฉ ููุบุงูุฉ):

ููู ูุญุตู ุนูู ูุณุฎุฉ ู
ู ูุฐุง So ุ ูุง ุดูุก ุบูุฑ choose ุงูู
ุฐููุฑ ุฃุนูุงู. ุงูู
ุญุงููุฉ ุงูุซุงููุฉ:
 insert : (addr : Addr) -> ValidatedAddrList lst -> ValidatedAddrList (addr :: lst) insert addr (MkValidatedAddrList lst) = case choose (valid $ types (addr :: lst)) of Left l => MkValidatedAddrList (addr :: lst) Right r => ?rhs 
ุชูุฑูุจุง typechetsya. "ุชูุฑูุจูุง" ูุฃูู ู
ู ุบูุฑ ุงููุงุถุญ ู
ุง ุงูุฐู ูุฌุจ ุงุณุชุจุฏุงูู rhs . ุจุฏูุงู ู
ู ุฐูู ุ ู
ู ุงููุงุถุญ: ูู ูุฐู ุงูุญุงูุฉ ุ ูุฌุจ ุนูู ุงููุธููุฉ ุงูุฅุจูุงุบ ุนู ุฎุทุฃ ุจุทุฑููุฉ ุฃู ุจุฃุฎุฑู. ูุฐูู ุ ุชุญุชุงุฌ ุฅูู ุชุบููุฑ ุงูุชูููุน ููู ุงูููู
ุฉ ุงูู
ุฑุชุฌุนุฉ ุ ุนูู ุณุจูู ุงูู
ุซุงู ุ ูู Maybe :
 insert : (addr : Addr) -> ValidatedAddrList lst -> Maybe (ValidatedAddrList (addr :: lst)) insert addr (MkValidatedAddrList lst) = case choose (valid $ types (addr :: lst)) of Left l => Just $ MkValidatedAddrList (addr :: lst) Right r => Nothing 
ูุฐุง ู
ุจูุท ููุนู
ู ูู
ุง ููุจุบู.
ูููู ุงูุขู ุธูุฑุช ุงูู
ุดููุฉ ุงูุชุงููุฉ ุบูุฑ ุงููุงุถุญุฉ ุ ูุงูุชู ูุงูุช ูู ุงููุงูุน ูู ุงูู
ูุงูุฉ ุงูุฃุตููุฉ. ูุง ูุชููู ููุน ูุฐู ุงููุธููุฉ ุนู ูุชุงุจุฉ ู
ุซู ูุฐุง ุงูุชูููุฐ:
 insert : (addr : Addr) -> ValidatedAddrList lst -> Maybe (ValidatedAddrList (addr :: lst)) insert addr (MkValidatedAddrList lst) = Nothing 
ุฃู ูููู ุฏุงุฆู
ูุง ุฃูู ูุง ูู
ูููุง ุจูุงุก ูุงุฆู
ุฉ ุนูุงููู ุฌุฏูุฏุฉ. Typhechaetsyaุ ูุนู
 ูู ูุฐุง ุตุญูุญุ ุญุณูุง ุ ุจุงููุงุฏ. ูู ูู
ูู ุชุฌูุจ ุฐููุ
ุงุชุถุญ ุฃูู ู
ู
ูู ุ ููุฏููุง ูู ุงูุฃุฏูุงุช ุงููุงุฒู
ุฉ ูุฐูู. ูู ุญุงูุฉ ูุฌุงุญ ุฐูู ุ insert ValidatedAddrList ุ ูุงูุชู ุชุญุชูู ุนูู ุฏููู ุนูู ูุฐุง ุงููุฌุงุญ. ูุฐุง ุฃุถู ุชูุงุธุฑูุง ุฃููููุง ูุงุทูุจ ู
ู ุงููุธููุฉ ุฃู ุชุฑุฌุน ุฃูุถูุง ุฅูู ุฏููู ุนูู ุงููุดู!
 insert : (addr : Addr) -> ValidatedAddrList lst -> Either (So (not $ valid $ types (addr :: lst))) (ValidatedAddrList (addr :: lst)) insert addr (MkValidatedAddrList lst) = case choose (valid $ types (addr :: lst)) of Left l => Right $ MkValidatedAddrList (addr :: lst) Right r => Left r 
ูุง ูู
ูููุง ุงูุขู ุฃุฎุฐ Nothing ูุฅุนุงุฏุชู ุฏุงุฆู
ูุง.
ูู
ููู ุฃู ุชูุนู ุงูุดูุก ููุณู ููุธุงุฆู ุฅุฒุงูุฉ ุงูุนููุงู ูู
ุง ุดุงุจู ุฐูู.
ุฏุนููุง ูุฑู ููู ูุจุฏู ูู ุดูุก ุงูุขู ูู ุงูููุงูุฉ.
ููุญุงูู ุฅูุดุงุก ูุงุฆู
ุฉ ุนูุงููู ูุงุฑุบุฉ:

ู
ู ุงูู
ุณุชุญูู ุ ูุงุฆู
ุฉ ูุงุฑุบุฉ ุบูุฑ ุตุงูุญุฉ.
ู
ุงุฐุง ุนู ูุงุฆู
ุฉ ู
ู ุงูุนููุงู ุงูุจุฑูุฏู ููุทุ

ุญุณููุง ุ ุฏุนูุง ูุญุงูู ุฅุฏุฑุงุฌ ุงูุนููุงู ุงูุจุฑูุฏู ูู ุงููุงุฆู
ุฉ ุงูุชู ุชุญุชูู ุจุงููุนู ุนูู ุงูุนููุงู ุงูุจุฑูุฏู:

ุฏุนูุง ูุญุงูู ุฅุฏุฎุงู ุงูุจุฑูุฏ ุงูุฅููุชุฑููู:

ูู ุงูููุงูุฉ ุ ูุนู
ู ูู ุดูุก ุชู
ุงู
ูุง ูู
ุง ูู ู
ุชููุน.
Phew. ุงุนุชูุฏุช ุฃููุง ุณุชููู ุซูุงุซุฉ ุฃุณุทุฑ ุ ูููู ุชุจูู ุฃููุง ุฃุทูู ููููุงู. ููุณุชูุดู ุฅูู ุฃู ู
ุฏู ูู
ูู ุฃู ูุฐูุจ ูู Haskell ุ ุณูููู ูู ุงูู
ูุงูุฉ ุงูุชุงููุฉ. ูู ุบุถูู ุฐูู ุ ููููุง
ุชุฃู
ู
ู
ุง ูู ูู ุงูููุงูุฉ ุฑุจุญ ู
ุซู ูุฐุง ุงููุฑุงุฑ ู
ูุงุฑูุฉ ุจุงููุฑุงุฑ ุงููุงุฑุฏ ูู ุงูู
ูุงูุฉ ุ ูุงูุฐู ุฃุดุฑูุง ุฅููู ูู ุงูุจุฏุงูุฉุ
- ู
ุฑุฉ ุฃุฎุฑู ุ ูู ุฃูุซุฑ ูุงุจููุฉ ููุชุทููุฑ. ูุธุงุฆู ุงูุชุญูู ุงูู
ุนูุฏุฉ ุฃุณูู ูู ุงููุชุงุจุฉ.
- ุฅูู ุฃูุซุฑ ุนุฒูุฉ. ูุง ูุฌุจ ุฃู ูุนุฑู ุฑู
ุฒ ุงูุนู
ูู ู
ุง ุจุฏุงุฎู ูุธููุฉ ุงูุชุญูู ู
ู ุงูุตุญุฉ ุ ูู ุญูู ุฃู ูู
ูุฐุฌ ContactInfoู
ู ุงูู
ูุงูุฉ ุงูุฃุตููุฉ ูุชุทูุจ ุฑุจุทู.
- ุชุชู
 ูุชุงุจุฉ ู
ูุทู ุงูุชุญูู ูู ุดูู ูุธุงุฆู ุนุงุฏูุฉ ูู
ุฃูููุฉ ุ ุจุญูุซ ูู
ูู ุงูุชุญูู ู
ูู ุนูู ุงูููุฑ ู
ู ุฎูุงู ุงููุฑุงุกุฉ ุงูู
ุฏุฑูุณุฉ ูุงุฎุชุจุงุฑู ู
ู ุฎูุงู ุงุฎุชุจุงุฑุงุช ููุช ุงูุชุฑุฌู
ุฉ ุ ุจุฏูุงู ู
ู ุงุดุชูุงู ู
ุนูู ุงูุชุญูู ู
ู ูู
ูุฐุฌ ููุน ุงูุจูุงูุงุช ุงูุฐู ูู
ุซู ูุชูุฌุฉ ุชู
 ุงูุชุญูู ู
ููุง ุจุงููุนู.
- ูุตุจุญ ู
ู ุงูู
ู
ูู ุชุญุฏูุฏ ุณููู ุงููุธุงุฆู ุงูุชู ุชุนู
ู ู
ุน ููุน ุงูุจูุงูุงุช ุงูุชู ุชูู
ูุง ุจุดูู ุฃูุซุฑ ุฏูุฉ ุ ุฎุงุตุฉ ูู ุญุงูุฉ ุนุฏู
 ุงุฌุชูุงุฒ ุงูุงุฎุชุจุงุฑ. ุนูู ุณุจูู ุงูู
ุซุงู ุ ู
ู ุงูู
ุณุชุญูู ุจุจุณุงุทุฉ ูุชุงุจุฉ insertุงูู
ูุชูุจ ููุชูุฌุฉ ุบูุฑ ุตุญูุญุฉ . ูุจุงูู
ุซู ุ ูู
ูู ููู
ุฑุก ุฃู ููุชุจinsertOrReplaceูinsertOrIgnoreูู
ุง ุดุงุจู ุ ูุงูุฐู ุชู
 ุชุญุฏูุฏ ุณูููู ุจุงููุงู
ู ูู ุงูููุน.
ู
ุง ูู ุงูุฑุจุญ ู
ูุงุฑูุฉ ุจุญู OOP ู
ุซู ูุฐุงุ
 class ValidatedAddrListClass { public: ValidatedAddrListClass(std::vector<Addr> addrs) { if (!valid(addrs)) throw ValidationError {}; } }; 
- ุงูููุฏ ุฃูุซุฑ ูู
ุทููุง ูุฃู
ุงููุง. ูู ุงูุญุงูุฉ ุงูู
ุฐููุฑุฉ ุฃุนูุงู ุ ูุฅู ุงูุดูู ูู ุฅุฌุฑุงุก ูุชู
 ูุญุตู ู
ุฑุฉ ูุงุญุฏุฉ ุ ูุงูุฐู ูุณู ุญููู ูุงุญููุง. ูู ุดูุก ู
ุจูู ุนูู ุงูุตุฏู ูููู
 ุฃูู ุฅุฐุง ูุงู ูุฏูู ValidatedAddrListClassุ ูุฅู ุชูููุฐู ูุงู
 ุจุฅุฌุฑุงุก ูุญุต ููุงู. ูุง ูู
ูู ุงุฎุชูุงุฑ ุญูููุฉ ูุฐุง ุงูุงุฎุชูุงุฑ ู
ู ุงููุตู ูููู
ุฉ ู
ุนููุฉ. ูู ุญุงูุฉ ูุฌูุฏ ููู
ุฉ ู
ู ููุน ู
ุง ุ ูู
ูู ููู ูุฐู ุงูููู
ุฉ ุจูู ุฃุฌุฒุงุก ู
ุฎุชููุฉ ู
ู ุงูุจุฑูุงู
ุฌ ุ ูุชุณุชุฎุฏู
 ูุจูุงุก ููู
 ุฃูุซุฑ ุชุนููุฏูุง (ุนูู ุณุจูู ุงูู
ุซุงู ุ ู
ุฑุฉ ุฃุฎุฑู ุ ุฑูุถ ูุฐุง ุงูุงุฎุชูุงุฑ) ุ ูุงูุชุญููู (ุงูุธุฑ ุงูููุฑุฉ ุงูุชุงููุฉ) ุ ูุนู
ูู
ูุง ุชูุนู ููุณ ุงูุดูุก ุงูุฐู ุงุนุชุฏูุง ุงูููุงู
 ุจู ู
ุน ุงูููู
.
- ูู
ูู ุงุณุชุฎุฏุงู
 ุนู
ููุงุช ุงูุชุญูู ูุฐู ูู ู
ุทุงุจูุฉ ุงููู
ุท (ุงูุชุงุจุน). ุตุญูุญ ุ ููุณ ูู ุญุงูุฉ ูุฐู ุงููุธููุฉ validูููุณ ูู ุญุงูุฉ ุฅุฏุฑูุณ ุ ููู ู
ุนูุฏุฉ ุจุดูู ู
ุคูู
 ุ ูุฅุฏุฑูุณ ู
ู
ูุฉ ุจุดูู ู
ุคูู
 ุจุญูุซ ูู
ูู ุงุณุชุฎุฑุงุฌ ุงูู
ุนููู
ุงุช ุงูู
ููุฏุฉ ููุฃูู
ุงุท ู
ู ุงูุจููุฉvalid. ูู
ุน ุฐูู ุ ูู
ูู ุฅุนุงุฏุฉ ูุชุงุจุฉ ุงูุตุงูุญ ุจุฃุณููุจ ุฃูุซุฑ ู
ูุงุกู
ุฉ ูู
ุทุงุจูุฉ ุงูุฃูู
ุงุท ุ ูููู ูุฐุง ูุชุฌุงูุฒ ูุทุงู ูุฐู ุงูู
ูุงูุฉ ูููุณ ุจุดูู ุนุงู
 ุชุงูููุง ูู ุญุฏ ุฐุงุชู.
ู
ุง ูู ุนููุจูุ
ุฃุฑู ุนูุจูุง ุฃุณุงุณููุง ูุงุญุฏูุง ุฎุทูุฑูุง: ูุงูุตูุงุญ valid ููุธููุฉ ุบุจูุฉ ุฌุฏูุง. ุชููู
 ุจุฅุฑุฌุงุน ุฌุฒุก ูุงุญุฏ ููุท ู
ู ุงูู
ุนููู
ุงุช - ุณูุงุก ุงุฌุชุงุฒุช ุงูุจูุงูุงุช ุงูุชุญูู ู
ู ุงูุตุญุฉ ุฃู
 ูุง. ูู ุญุงูุฉ ุงูุฃููุงุน ุงูุฃูุซุฑ ุฐูุงุกู ุ ูู
ูููุง ุชุญููู ุดูุก ุฃูุซุฑ ุฅุซุงุฑุฉ ููุงูุชู
ุงู
.
ุนูู ุณุจูู ุงูู
ุซุงู ุ ุชุฎูู ุฃู ุดุฑุท ุชูุฑุฏ ุงูุนูุงููู ูุฏ ุงุฎุชูู ู
ู ุงูู
ุนุงุฑู ุงูุชูููุฏูุฉ. ูู ูุฐู ุงูุญุงูุฉ ุ ู
ู ุงููุงุถุญ ุฃู ุฅุถุงูุฉ ุนููุงู ุฌุฏูุฏ ุฅูู ูุงุฆู
ุฉ ุงูุนูุงููู ุงูุญุงููุฉ ูู ูุฌุนู ุงููุงุฆู
ุฉ ุบูุฑ ุตุงูุญุฉ ุ ูุฐูู ูู
ูููุง ุฅุซุจุงุช ูุฐู ุงููุธุฑูุฉ ุนู ุทุฑูู ูุชุงุจุฉ ุฏุงูุฉ ู
ู ุงูููุน So (valid $ types lst) -> So (valid $ types $ addr :: lst) ุ ูุงุณุชุฎุฏู
ูุง ุ ุนูู ุณุจูู ุงูู
ุซุงู ุ ููุชุงุจุฉ ุขู
ู ููููุน ุฏุงุฆู
ูุง
 insert : (addr : Addr) -> ValidatedAddrList lst -> ValidatedAddrList (addr :: lst) 
ูููู ุ ููุฃุณู ุ ุงููุธุฑูุงุช ู
ุซู ุงูุนูุฏูุฉ ูุงูุงุณุชูุฑุงุก ุ ููุง ุชุญุชูู ู
ุดููุชูุง ุนูู ุฃู ูููู ุงุณุชูุฑุงุฆู ุฃููู ุ ูุฐูู ุ ูู ุฑุฃูู ุ ูุฅู ุงูููุฏ ู
ุน ุงูุจููุท ุงูุจูููู ุงูุตุงูุญ ููุณ ุณูุฆูุง ุฃูุถูุง.