ูƒูŠููŠุฉ ุฌุนู„ ุงู„ุฏูˆู„ ุบูŠุฑ ุงู„ุตุงู„ุญุฉ ุฃูƒุซุฑ ุญุชู‰ ู„ุง ุชูˆุตู

ู…ู†ุฐ ูˆู‚ุช ู„ูŠุณ ุจุจุนูŠุฏ ุŒ ุชู…ุช ุชุฑุฌู…ุฉ ู…ู‚ุงู„ุฉ ููŠ ู‡ุจุฑ ุญูˆู„ ูƒูŠููŠุฉ ุงุณุชุฎุฏุงู… ุฃู†ูˆุงุน ุงู„ุจูŠุงู†ุงุช ุงู„ุฌุจุฑูŠุฉ ู„ู„ุชุฃูƒุฏ ู…ู† ุฃู† ุงู„ุญุงู„ุงุช ุบูŠุฑ ุงู„ุตุญูŠุญุฉ ู„ุง ูŠู…ูƒู† ุงู„ุชุนุจูŠุฑ ุนู†ู‡ุง. ู†ู†ุธุฑ ุงู„ูŠูˆู… ุฅู„ู‰ ุทุฑูŠู‚ุฉ ุฃูƒุซุฑ ุนู…ูˆู…ูŠุฉ ูˆู‚ุงุจู„ุฉ ู„ู„ุชูˆุณูŠุน ูˆุขู…ู†ุฉ ู„ู„ุชุนุจูŠุฑ ุนู† ู…ุง ู„ุง ูŠู…ูƒู† ุงู„ุชุนุจูŠุฑ ุนู†ู‡ ุŒ ูˆุณูˆู ูŠุณุงุนุฏู†ุง ู‡ุงุณูƒู„ ููŠ ุฐู„ูƒ.


ุจุงุฎุชุตุงุฑ ุŒ ุชู†ุงู‚ุด ู‡ุฐู‡ ุงู„ู…ู‚ุงู„ุฉ ุจุนุถ ุงู„ูƒูŠุงู†ุงุช ู…ุน ุนู†ูˆุงู† ุจุฑูŠุฏูŠ ูˆุนู†ูˆุงู† ุจุฑูŠุฏ ุฅู„ูƒุชุฑูˆู†ูŠ ุŒ ูˆูƒุฐู„ูƒ ู…ุน ุงู„ุดุฑุท ุงู„ุฅุถุงููŠ ุงู„ุฐูŠ ูŠุฌุจ ุฃู† ูŠูƒูˆู† ู‡ู†ุงูƒ ูˆุงุญุฏ ุนู„ู‰ ุงู„ุฃู‚ู„ ู…ู† ู‡ุฐู‡ ุงู„ุนู†ุงูˆูŠู†. ูƒูŠู ูŠู‚ุชุฑุญ ุงู„ุชุนุจูŠุฑ ุนู† ู‡ุฐุง ุงู„ุดุฑุท ุนู„ู‰ ู…ุณุชูˆู‰ ุงู„ู†ูˆุนุŸ ูŠู‚ุชุฑุญ ูƒุชุงุจุฉ ุงู„ุนู†ุงูˆูŠู† ุนู„ู‰ ุงู„ู†ุญูˆ ุงู„ุชุงู„ูŠ:


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 --      hasPost = Post `elem` xs hasEmail = Email `elem` xs hasOffice = Office `elem` xs in hasNoDups && (hasPost || (hasEmail && hasOffice)) 

ูˆุณูˆู ูŠู„ู‚ูŠ ุจุจุนุถ ุงู„ุฅุนุฏุงู… ุฅุฐุง ุฃุนุงุฏ 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 ุŒ ุณู†ูƒูˆู† ููŠ ุงู„ู…ู‚ุงู„ุฉ ุงู„ุชุงู„ูŠุฉ. ููŠ ุบุถูˆู† ุฐู„ูƒ ุŒ ู‚ู„ูŠู„ุง


ุชุฃู…ู„


ู…ุง ู‡ูˆ ููŠ ุงู„ู†ู‡ุงูŠุฉ ุฑุจุญ ู…ุซู„ ู‡ุฐุง ุงู„ู‚ุฑุงุฑ ู…ู‚ุงุฑู†ุฉ ุจุงู„ู‚ุฑุงุฑ ุงู„ูˆุงุฑุฏ ููŠ ุงู„ู…ู‚ุงู„ุฉ ุŒ ูˆุงู„ุฐูŠ ุฃุดุฑู†ุง ุฅู„ูŠู‡ ููŠ ุงู„ุจุฏุงูŠุฉุŸ


  1. ู…ุฑุฉ ุฃุฎุฑู‰ ุŒ ู‡ูˆ ุฃูƒุซุฑ ู‚ุงุจู„ูŠุฉ ู„ู„ุชุทูˆูŠุฑ. ูˆุธุงุฆู ุงู„ุชุญู‚ู‚ ุงู„ู…ุนู‚ุฏุฉ ุฃุณู‡ู„ ููŠ ุงู„ูƒุชุงุจุฉ.
  2. ุฅู†ู‡ ุฃูƒุซุฑ ุนุฒู„ุฉ. ู„ุง ูŠุฌุจ ุฃู† ูŠุนุฑู ุฑู…ุฒ ุงู„ุนู…ูŠู„ ู…ุง ุจุฏุงุฎู„ ูˆุธูŠูุฉ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุตุญุฉ ุŒ ููŠ ุญูŠู† ุฃู† ู†ู…ูˆุฐุฌ ContactInfo ู…ู† ุงู„ู…ู‚ุงู„ุฉ ุงู„ุฃุตู„ูŠุฉ ูŠุชุทู„ุจ ุฑุจุทู‡.
  3. ุชุชู… ูƒุชุงุจุฉ ู…ู†ุทู‚ ุงู„ุชุญู‚ู‚ ููŠ ุดูƒู„ ูˆุธุงุฆู ุนุงุฏูŠุฉ ูˆู…ุฃู„ูˆูุฉ ุŒ ุจุญูŠุซ ูŠู…ูƒู† ุงู„ุชุญู‚ู‚ ู…ู†ู‡ ุนู„ู‰ ุงู„ููˆุฑ ู…ู† ุฎู„ุงู„ ุงู„ู‚ุฑุงุกุฉ ุงู„ู…ุฏุฑูˆุณุฉ ูˆุงุฎุชุจุงุฑู‡ ู…ู† ุฎู„ุงู„ ุงุฎุชุจุงุฑุงุช ูˆู‚ุช ุงู„ุชุฑุฌู…ุฉ ุŒ ุจุฏู„ุงู‹ ู…ู† ุงุดุชู‚ุงู‚ ู…ุนู†ู‰ ุงู„ุชุญู‚ู‚ ู…ู† ู†ู…ูˆุฐุฌ ู†ูˆุน ุงู„ุจูŠุงู†ุงุช ุงู„ุฐูŠ ูŠู…ุซู„ ู†ุชูŠุฌุฉ ุชู… ุงู„ุชุญู‚ู‚ ู…ู†ู‡ุง ุจุงู„ูุนู„.
  4. ูŠุตุจุญ ู…ู† ุงู„ู…ู…ูƒู† ุชุญุฏูŠุฏ ุณู„ูˆูƒ ุงู„ูˆุธุงุฆู ุงู„ุชูŠ ุชุนู…ู„ ู…ุน ู†ูˆุน ุงู„ุจูŠุงู†ุงุช ุงู„ุชูŠ ุชู‡ู…ู†ุง ุจุดูƒู„ ุฃูƒุซุฑ ุฏู‚ุฉ ุŒ ุฎุงุตุฉ ููŠ ุญุงู„ุฉ ุนุฏู… ุงุฌุชูŠุงุฒ ุงู„ุงุฎุชุจุงุฑ. ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ู…ู† ุงู„ู…ุณุชุญูŠู„ ุจุจุณุงุทุฉ ูƒุชุงุจุฉ insert ุงู„ู…ูƒุชูˆุจ ูƒู†ุชูŠุฌุฉ ุบูŠุฑ ุตุญูŠุญุฉ . ูˆุจุงู„ู…ุซู„ ุŒ ูŠู…ูƒู† ู„ู„ู…ุฑุก ุฃู† ูŠูƒุชุจ insertOrReplace ูˆ insertOrIgnore ูˆู…ุง ุดุงุจู‡ ุŒ ูˆุงู„ุฐูŠ ุชู… ุชุญุฏูŠุฏ ุณู„ูˆูƒู‡ ุจุงู„ูƒุงู…ู„ ููŠ ุงู„ู†ูˆุน.

ู…ุง ู‡ูˆ ุงู„ุฑุจุญ ู…ู‚ุงุฑู†ุฉ ุจุญู„ OOP ู…ุซู„ ู‡ุฐุงุŸ


 class ValidatedAddrListClass { public: ValidatedAddrListClass(std::vector<Addr> addrs) { if (!valid(addrs)) throw ValidationError {}; } }; 

  1. ุงู„ูƒูˆุฏ ุฃูƒุซุฑ ู†ู…ุทูŠู‹ุง ูˆุฃู…ุงู†ู‹ุง. ููŠ ุงู„ุญุงู„ุฉ ุงู„ู…ุฐูƒูˆุฑุฉ ุฃุนู„ุงู‡ ุŒ ูุฅู† ุงู„ุดูŠูƒ ู‡ูˆ ุฅุฌุฑุงุก ูŠุชู… ูุญุตู‡ ู…ุฑุฉ ูˆุงุญุฏุฉ ุŒ ูˆุงู„ุฐูŠ ู†ุณูŠ ุญูˆู„ู‡ ู„ุงุญู‚ู‹ุง. ูƒู„ ุดูŠุก ู…ุจู†ูŠ ุนู„ู‰ ุงู„ุตุฏู‚ ูˆูู‡ู… ุฃู†ู‡ ุฅุฐุง ูƒุงู† ู„ุฏูŠูƒ ValidatedAddrListClass ุŒ ูุฅู† ุชู†ููŠุฐู‡ ู‚ุงู… ุจุฅุฌุฑุงุก ูุญุต ู‡ู†ุงูƒ. ู„ุง ูŠู…ูƒู† ุงุฎุชูŠุงุฑ ุญู‚ูŠู‚ุฉ ู‡ุฐุง ุงู„ุงุฎุชูŠุงุฑ ู…ู† ุงู„ูุตู„ ูƒู‚ูŠู…ุฉ ู…ุนูŠู†ุฉ. ููŠ ุญุงู„ุฉ ูˆุฌูˆุฏ ู‚ูŠู…ุฉ ู…ู† ู†ูˆุน ู…ุง ุŒ ูŠู…ูƒู† ู†ู‚ู„ ู‡ุฐู‡ ุงู„ู‚ูŠู…ุฉ ุจูŠู† ุฃุฌุฒุงุก ู…ุฎุชู„ูุฉ ู…ู† ุงู„ุจุฑู†ุงู…ุฌ ุŒ ูˆุชุณุชุฎุฏู… ู„ุจู†ุงุก ู‚ูŠู… ุฃูƒุซุฑ ุชุนู‚ูŠุฏู‹ุง (ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ู…ุฑุฉ ุฃุฎุฑู‰ ุŒ ุฑูุถ ู‡ุฐุง ุงู„ุงุฎุชูŠุงุฑ) ุŒ ูˆุงู„ุชุญู‚ูŠู‚ (ุงู†ุธุฑ ุงู„ูู‚ุฑุฉ ุงู„ุชุงู„ูŠุฉ) ุŒ ูˆุนู…ูˆู…ู‹ุง ุชูุนู„ ู†ูุณ ุงู„ุดูŠุก ุงู„ุฐูŠ ุงุนุชุฏู†ุง ุงู„ู‚ูŠุงู… ุจู‡ ู…ุน ุงู„ู‚ูŠู….
  2. ูŠู…ูƒู† ุงุณุชุฎุฏุงู… ุนู…ู„ูŠุงุช ุงู„ุชุญู‚ู‚ ู‡ุฐู‡ ููŠ ู…ุทุงุจู‚ุฉ ุงู„ู†ู…ุท (ุงู„ุชุงุจุน). ุตุญูŠุญ ุŒ ู„ูŠุณ ููŠ ุญุงู„ุฉ ู‡ุฐู‡ ุงู„ูˆุธูŠูุฉ valid ูˆู„ูŠุณ ููŠ ุญุงู„ุฉ ุฅุฏุฑูŠุณ ุŒ ูู‡ูŠ ู…ุนู‚ุฏุฉ ุจุดูƒู„ ู…ุคู„ู… ุŒ ูˆุฅุฏุฑูŠุณ ู…ู…ู„ุฉ ุจุดูƒู„ ู…ุคู„ู… ุจุญูŠุซ ูŠู…ูƒู† ุงุณุชุฎุฑุงุฌ ุงู„ู…ุนู„ูˆู…ุงุช ุงู„ู…ููŠุฏุฉ ู„ู„ุฃู†ู…ุงุท ู…ู† ุงู„ุจู†ูŠุฉ valid . ูˆู…ุน ุฐู„ูƒ ุŒ ูŠู…ูƒู† ุฅุนุงุฏุฉ ูƒุชุงุจุฉ ุงู„ุตุงู„ุญ ุจุฃุณู„ูˆุจ ุฃูƒุซุฑ ู…ู„ุงุกู…ุฉ ู„ู…ุทุงุจู‚ุฉ ุงู„ุฃู†ู…ุงุท ุŒ ูˆู„ูƒู† ู‡ุฐุง ูŠุชุฌุงูˆุฒ ู†ุทุงู‚ ู‡ุฐู‡ ุงู„ู…ู‚ุงู„ุฉ ูˆู„ูŠุณ ุจุดูƒู„ ุนุงู… ุชุงูู‡ู‹ุง ููŠ ุญุฏ ุฐุงุชู‡.

ู…ุง ู‡ูŠ ุนูŠูˆุจู‡ุŸ


ุฃุฑู‰ ุนูŠุจู‹ุง ุฃุณุงุณูŠู‹ุง ูˆุงุญุฏู‹ุง ุฎุทูŠุฑู‹ุง: ูุงู„ุตู„ุงุญ valid ู„ูˆุธูŠูุฉ ุบุจูŠุฉ ุฌุฏู‹ุง. ุชู‚ูˆู… ุจุฅุฑุฌุงุน ุฌุฒุก ูˆุงุญุฏ ูู‚ุท ู…ู† ุงู„ู…ุนู„ูˆู…ุงุช - ุณูˆุงุก ุงุฌุชุงุฒุช ุงู„ุจูŠุงู†ุงุช ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุตุญุฉ ุฃู… ู„ุง. ููŠ ุญุงู„ุฉ ุงู„ุฃู†ูˆุงุน ุงู„ุฃูƒุซุฑ ุฐูƒุงุกู‹ ุŒ ูŠู…ูƒู†ู†ุง ุชุญู‚ูŠู‚ ุดูŠุก ุฃูƒุซุฑ ุฅุซุงุฑุฉ ู„ู„ุงู‡ุชู…ุงู….


ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ุชุฎูŠู„ ุฃู† ุดุฑุท ุชูุฑุฏ ุงู„ุนู†ุงูˆูŠู† ู‚ุฏ ุงุฎุชูู‰ ู…ู† ุงู„ู…ุนุงุฑู ุงู„ุชู‚ู„ูŠุฏูŠุฉ. ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ุŒ ู…ู† ุงู„ูˆุงุถุญ ุฃู† ุฅุถุงูุฉ ุนู†ูˆุงู† ุฌุฏูŠุฏ ุฅู„ู‰ ู‚ุงุฆู…ุฉ ุงู„ุนู†ุงูˆูŠู† ุงู„ุญุงู„ูŠุฉ ู„ู† ูŠุฌุนู„ ุงู„ู‚ุงุฆู…ุฉ ุบูŠุฑ ุตุงู„ุญุฉ ุŒ ู„ุฐู„ูƒ ูŠู…ูƒู†ู†ุง ุฅุซุจุงุช ู‡ุฐู‡ ุงู„ู†ุธุฑูŠุฉ ุนู† ุทุฑูŠู‚ ูƒุชุงุจุฉ ุฏุงู„ุฉ ู…ู† ุงู„ู†ูˆุน So (valid $ types lst) -> So (valid $ types $ addr :: lst) ุŒ ูˆุงุณุชุฎุฏู…ู‡ุง ุŒ ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ู„ูƒุชุงุจุฉ ุขู…ู† ู„ู„ู†ูˆุน ุฏุงุฆู…ู‹ุง


 insert : (addr : Addr) -> ValidatedAddrList lst -> ValidatedAddrList (addr :: lst) 

ูˆู„ูƒู† ุŒ ู„ู„ุฃุณู ุŒ ุงู„ู†ุธุฑูŠุงุช ู…ุซู„ ุงู„ุนูˆุฏูŠุฉ ูˆุงู„ุงุณุชู‚ุฑุงุก ุŒ ูˆู„ุง ุชุญุชูˆูŠ ู…ุดูƒู„ุชู†ุง ุนู„ู‰ ุฃูŠ ู‡ูŠูƒู„ ุงุณุชู‚ุฑุงุฆูŠ ุฃู†ูŠู‚ ุŒ ู„ุฐู„ูƒ ุŒ ููŠ ุฑุฃูŠูŠ ุŒ ูุฅู† ุงู„ูƒูˆุฏ ู…ุน ุงู„ุจู„ูˆุท ุงู„ุจู„ูˆู„ูŠ ุงู„ุตุงู„ุญ ู„ูŠุณ ุณูŠุฆู‹ุง ุฃูŠุถู‹ุง.

Source: https://habr.com/ru/post/ar428051/


All Articles