рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдмрд░ рдкрд░ рдмреАрдЬреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЧрд▓рдд рд░рд╛рдЬреНрдп рдЕрдХреНрд╖рдореНрдп рд╣реИрдВред рдЖрдЬ рд╣рдо рдЕрдХрдердиреАрдп рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд, рдкрд░рд┐рдорд╛рдкреНрдп рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╡рд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рд╕рдВрд╕реНрдерд╛ рдХреЛ рдореЗрд▓рд┐рдВрдЧ рдПрдбреНрд░реЗрд╕ рдФрд░ рдИрдореЗрд▓ рдПрдбреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд░реНрдд рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдПрдбреНрд░реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ? рдЗрд╕ рдкрддреЗ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ:
type ContactInfo = | EmailOnly of EmailContactInfo | PostOnly of PostalContactInfo | EmailAndPost of EmailContactInfo * PostalContactInfo
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ?
рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ (рдФрд░ рдЙрд╕ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реНрдХреЗрд▓реЗрдмрд▓ рдирд╣реАрдВ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддреАрди рдпрд╛ рдкрд╛рдВрдЪ, рдФрд░ рд╢реБрджреНрдзрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдРрд╕реА рджрд┐рдЦрддреА рд╣реИ рдЬреИрд╕реЗ "рдпрд╛ рддреЛ рдПрдХ рдореЗрд▓ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рджреЛрдиреЛрдВ рдПрдХ рдИрдореЗрд▓ рдкрддрд╛ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдкрддреЗ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП"ред рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣реЗрдВ рд╡реЗ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрддреНрдо-рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рддрд╛рд░рд╛рдВрдХрди рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдерд┐рддрд┐ TOR рд╕реЗ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддрд╛рд░рд╛рдВрдХрди рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред
рд╢реЗрдпрд░
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ? рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдкрд╣рд▓реЗ рд╣рдо рдкрддрд╛ рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдореЗрд▓ / рдИрдореЗрд▓ / рдбреЗрд╕реНрдХ рдирдВрдмрд░) рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╕рд╛рдордЧреНрд░реАред
data AddrType = Post | Email | Office
рд╣рдо рдЕрднреА рддрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрддрд╛ рд╕реВрдЪреА рдХреА рд╡реИрдзрддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рд╣рдордиреЗ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп OOP рднрд╛рд╖рд╛ рдХреЗ рдХреБрдЫ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреА, рддреЛ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ
valid :: [AddrType] -> Bool valid xs = let hasNoDups = nub xs == xs
рдФрд░ рдЕрдЧрд░ False
рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдХреБрдЫ рдлрд╛рдБрд╕реА рдХреА рд╕рдЬрд╛ рджреА рдЬрд╛рдПрдЧреАред
рдХреНрдпрд╛ рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рдЯрд╛рдЗрдорд░ рдХреА рдорджрдж рд╕реЗ рдЗрд╕рдХреЗ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рд╛рдБ, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдкрд░реНрдпрд╛рдкреНрдд рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИ, рдФрд░ рдмрд╛рдХреА рд▓реЗрдЦ рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЪреБрдиреЗрдВрдЧреЗред
рдпрд╣рд╛рдВ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╣рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреА, рдФрд░ рдЪреВрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ рдорд╛рдиреНрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдПрдЬреЗрдб рдпрд╛ рдЗрджрд░рд┐рд╕ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдЬреВрддреЗ рдмрджрд▓реЗрдВрдЧреЗ рдФрд░ рдЗрджрд░реАрд╕ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рдЗрдбрд┐рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдХрд╛рдлреА рдХрд░реАрдм рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
valid : List AddrType -> Bool
рдЕрдм рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдбреНрд░реЗрд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдПрдбреНрд░реЗрд╕ рдХреНрд▓рд╛рд╕ рдкрд░ рдлрд╝реАрд▓реНрдб рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдПрдирдПрдбреАрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдирдХреЛрдб рдХрд░реЗрдВ:
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
рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ t
рдХреБрдЫ AddrType AddrType
рдФрд░ рдЙрди fields
рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВрдпрд╣ рд╕рдмрд╕реЗ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреАрдПрдбреАрдЯреА рдХреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рдирд╣реАрдВ рджреЗрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ PostFields
, EmailFields
, OfficeFields
рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ
addrFields : AddrType -> Type addrFields Post = PostFields addrFields Email = EmailFields addrFields Office = OfficeFields
рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЗрдЦрди рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрднреА рднреА рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕реБрдЦрдж рддрдВрддреНрд░ рд╣реИрдВред
рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рдкреВрд░рд╛ рдкрддрд╛ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдкрддрд╛ рд╡рд░реНрдЧ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ:
Addr : Type Addr = (t : AddrType ** AddrFields t)
рдЯрд╛рдЗрдк рдереНрдпреЛрд░реА рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдпрджрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ Addr
рдХрд╛ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ AddrType
рдХрд╛ рдПрдХ рдорд╛рди t
рдФрд░ AddrFields t
рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрдХ рд╕рдорд╛рди рд╕реЗрдЯ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреЗ рдкрддреЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:
someEmailAddr : Addr someEmailAddr = (Email ** EmailFields "that@feel.bro") someOfficeAddr : Addr someOfficeAddr = (Office ** OfficeFields (-2) 762)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ EmailFields
рд╣рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХрдорд╛рддреНрд░ рдкрддрд╛ рд╡рд░реНрдЧ рдЬреЛ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд╡рд╣ Email
, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдорд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛:
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
рдкрддреЗ рдФрд░ рдХреБрдЫ valid : List AddrType -> Bool
рд╡рд┐рдзреЗрдп рдХреА 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
type (lst : List Addr) -> (prf : valid (types lst) = True) -> ValidatedAddrList lst
ред рдпрд╣реА рд╣реИ, рдпрд╣ lst
рдкрддреЛрдВ рдХреА рдХреБрдЫ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ valid (types lst) = True
рдХрд╛ рдПрдХ рдФрд░ prf
рддрд░реНрдХ valid (types lst) = True
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдореВрд▓реНрдп =
рдХреЗ рджрд╛рдИрдВ рдУрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЕрд░реНрдерд╛рдд, valid (types lst)
, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рддреНрдп рд╣реИред
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд╣рд╕реНрддрд╛рдХреНрд╖рд░ =
(x : A) -> (y : B) -> Type
рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, =
рджреЛ рдордирдорд╛рдирд╛ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ x
рдФрд░ y
(рд╕рдВрднрд╡рддрдГ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ A
рдФрд░ B
, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдИрдбреА рдореЗрдВ рдЕрд╕рдорд╛рдирддрд╛ рд╡рд┐рд╖рдо рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ)ред рддрдм рдХреНрдпрд╛ рд╕рдорд╛рдирддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдПрдХрдорд╛рддреНрд░ рдирд┐рд░реНрдорд╛рддрд╛ =
- рд▓рдЧрднрдЧ (x : A) -> x = x
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдк x = y
рдХрд╛ рдорд╛рди рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ Refl
(рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реИрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ x
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ y
рдмрд░рд╛рдмрд░ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╣рдо рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдХреБрдЫ рд╕рд╛рдмрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдиреЗ undefined
рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд╡рд╛рд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рддрд░реНрдХ рд╡рд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдХрд┐рд╕реА рднреА x
, y
рдЯрд╛рдЗрдк x = y
рдХрд╛ y
рд╢рдмреНрдж x = y
рдХреЛ undefined
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╣ рдХрд╣реЗрдВ рдХрд┐ рдмрдбрд╝реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣ рд╕рдорд╛рди рд╣реИ)ред
рд╣рдо рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдБ рд╕рдорд╛рдирддрд╛ рдХрд╛ рдорддрд▓рдм Haskell рдХреЗ Eq
рдпрд╛ C ++ рдореЗрдВ рдХрд┐рд╕реА рднреА operator==
рдЕрд░реНрде рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рд╣реИ: рд╕рдВрд░рдЪрдирд╛рддреНрдордХ, рдЬреЛ, рд╕рд░рд▓реАрдХрд░рдг рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╣реА рд░реВрдк рд╣реИ ред рдпрд╣реА рд╣реИ, рдЙрд╕реЗ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреЛ рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдорд╛рдирддрд╛ рдХреЗ рдореБрджреНрджреЗ рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рдорд╛рдирддрд╛ рдХреА рд╣рдорд╛рд░реА рд╕рдордЭ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо 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
рдЯрд╛рдЗрдкрд░рдЦреЗрд░ рд╢рдкрде рд▓реЗрддрд╛ рд╣реИ

рдЬреИрд╕реА рдЙрдореНрдореАрдж рдереАред рдЕрджреНрднреБрддред
рд╕рд░рд▓
рдЕрдм рд╣рдорд╛рд░реЗ ValidatedAddrList
рдереЛрдбрд╝рд╛ ValidatedAddrList
ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, True
рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреИрдЯрд░реНрди рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рд╣реИ, So
рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдИрдбреА рдореЗрдВ: рдЖрдк So x
рдХреЛ x = True
рд╕рдорд╛рдирд╛рд░реНрдердХ рд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдорд╛рдиреНрдпрдХреГрдд рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рддрдп рдХрд░реЗрдВ:
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
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдпрд╣ рдмрд╣реБрдд рд╣реА MkValidatedAddrList
рдФрд░ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ prf
рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ So (valid $ types lst)
, рдЬреЛ рд▓рдЧрднрдЧ valid (types lst) = True
ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо prf
рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕рдорд╛рдирддрд╛ рд░рдЦрддреА рд╣реИред
рдФрд░ рд╕рдмрд╕реЗ рдЦреВрдмрд╕реВрд░рдд рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдПрдХ рдЭрд╛рдВрдХреА рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдВ, рд╡реИрдзрддрд╛ рдЬрд╛рдБрдЪ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХрд░рдиреА рд╣реЛрдЧреА (рдХреНрдпреЛрдВрдХрд┐ рдкрддреЗ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдкрдврд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдорд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдпрд╣ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рдП: рдЗрд╕рдХреЗ рдмрд┐рдирд╛, ValidatedAddrList
рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдЖрдЗрдбрд┐рдпрд▓ рдореЗрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЕрдлрд╕реЛрд╕ред
рдбрд╛рд▓рдиреЗ
рд╕рддреНрдпрд╛рдкрди рдХреА рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдкрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕:
insert : (addr : Addr) -> ValidatedAddrList lst -> ValidatedAddrList (addr :: lst) insert addr (MkValidatedAddrList lst) = MkValidatedAddrList (addr :: lst)
рдирд╣реАрдВ, рдЯрд╛рдЗрдкреЛ-рдЪреЗрдХрд░ рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рджреЗрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╣реБрдд рдкрдардиреАрдп рдирд╣реАрдВ рд╣реИ, valid
рдХреА рд▓рд╛рдЧрдд рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ):

рд╣рдо рдЗрд╕рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рдЙрдкрд░реЛрдХреНрдд 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
рдпрд╣реА рд╣реИ, рд╣рдо рд╣рдореЗрд╢рд╛ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдкрддреЗ рдХреА рдПрдХ рдирдИ рд╕реВрдЪреА рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред Taypchekaetsya? рд╣рд╛рдВред рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ? рдЦреИрд░, рд╢рд╛рдпрдж рд╣реАред рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рд╣реИрдВред рдпрджрд┐ рд╕рдлрд▓ рд╣реИ, рддреЛ рдПрдХ ValidatedAddrList
рд░рд┐рдЯрд░реНрди insert
, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рд╕рдлрд▓рддрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИред рддреЛ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд░реВрдкрддрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ!
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
рд▓реМрдЯрд╛ рд╕рдХрддреЗред
рдЖрдк рдкрддреЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкрд╕рдВрдж рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рдпрд╣ рд╕рдм рдЖрдЦрд┐рд░ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдЖрдЗрдП рдПрдХ рдЦрд╛рд▓реА рдкрддрд╛ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ, рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред
рд╕рд┐рд░реНрдл рдПрдХ рдореЗрд▓рд┐рдВрдЧ рдкрддреЗ рдХреА рд╕реВрдЪреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдореЗрд▓рд┐рдВрдЧ рдкрддреЗ рдХреЛ рдЙрд╕ рд╕реВрдЪреА рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЗрд▓рд┐рдВрдЧ рдкрддрд╛ рд╣реИ:

рдЖрдЗрдП рдИрдореЗрд▓ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:

рдЕрдВрдд рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
Ffuhред рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рддреАрди рд▓рд╛рдЗрдиреЗрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝реА рд▓рдВрдмреА рд╣реЛ рдЧрдИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрд┐рддрдиреА рджреВрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕ рдмреАрдЪ, рдереЛрдбрд╝рд╛
рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд
рдХреНрдпрд╛, рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдирд┐рд░реНрдгрдп рдХрд╛ рд▓рд╛рдн рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдерд╛?
- рдпрд╣, рдлрд┐рд░ рд╕реЗ, рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╣реИред рдЬрдЯрд┐рд▓ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред
- рдпрд╣ рдЕрдзрд┐рдХ рдкреГрдердХ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореВрд▓ рд▓реЗрдЦ рд╕реЗ
ContactInfo
рдлреЙрд░реНрдо рдХреЛ рдЗрд╕реЗ рдмрд╛рдВрдзрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред - рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдкрд░рд┐рдЪрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рд╕рдордп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдкрдврд╝рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдареАрдХ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХреЗ, рдмрдЬрд╛рдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреЙрд░реНрдо рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдЕрд░реНрде рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред
- рдпрд╣ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ
insert
рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ ред рдЗрд╕реА рддрд░рд╣, рдХреЛрдИ insertOrReplace
, insertOrIgnore
рдФрд░ insertOrReplace
рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЯрд╛рдЗрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред
OOP рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИ?
class ValidatedAddrListClass { public: ValidatedAddrListClass(std::vector<Addr> addrs) { if (!valid(addrs)) throw ValidationError {}; } };
- рдХреЛрдб рдЕрдзрд┐рдХ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЪреЗрдХ рдПрдХ рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдмрд╛рд░ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реЗ рдмрд╛рдж рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдИрдорд╛рдирджрд╛рд░реА рдФрд░ рдЗрд╕ рд╕рдордЭ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕
ValidatedAddrListClass
, рддреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдПрдХ рдмрд╛рд░ рд╡рд╣рд╛рдВ рдЬрд╛рдВрдЪ рдХреА рдереАред рд╡рд░реНрдЧ рд╕реЗ рдЗрд╕ рдЪреЗрдХ рдХреЗ рддрдереНрдп рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдореВрд▓реНрдпреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рд╕реЗ, рдЗрд╕ рдЪреЗрдХ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЬрд╛рдВрдЪ (рдЕрдЧрд▓рд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рджреЗрдЦреЗрдВ), рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рд╡реИрд╕рд╛ рд╣реА рдХрд░реЗрдВ рдЬреИрд╕рд╛ рд╣рдо рдХрд░рддреЗ рдереЗред рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рдеред - рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ (рдирд┐рд░реНрднрд░) рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
valid
рдирд╣реАрдВ valid
рдФрд░ рди рд╣реА idris рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рджрд░реНрджрдирд╛рдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ, рдФрд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕реБрд╕реНрдд рд╣реИ рддрд╛рдХрд┐ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ valid
рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХреЗред рдлрд┐рд░ рднреА, valid
рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рд╢реИрд▓реА рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИред
рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ?
рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдЧрдВрднреАрд░ рдореМрд▓рд┐рдХ рджреЛрд╖ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: valid
рдмрд╣реБрдд рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд┐рдЯ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ - рдЪрд╛рд╣реЗ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рд╕реЗ рдЧреБрдЬрд░рд╛ рд╣реЛ рдпрд╛ рдирд╣реАрдВред рд╣реЛрд╢рд┐рдпрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдкрддреЗ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЯреАрдХреЗ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдкрддреЗ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ рдкрддрд╛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕реВрдЪреА рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдХрд░ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ So (valid $ types lst) -> So (valid $ types $ addr :: lst)
, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк-рд╕реЗрдл рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рд╕рдлрд▓
insert : (addr : Addr) -> ValidatedAddrList lst -> ValidatedAddrList (addr :: lst)
рд▓реЗрдХрд┐рди, рдЕрдлрд╕реЛрд╕, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдкреНрд░реЗрд░рдг рдХреА рддрд░рд╣ рдкреНрд░рдореЗрдп, рдФрд░ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдХреЛрдИ рд╕реБрдВрджрд░ рдкреНрд░реЗрд░рдХ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдУрдХ рдмреВрд▓рд┐рдпрди valid
рдХреЗ рд╕рд╛рде рдХреЛрдб рднреА рдЕрдЪреНрдЫрд╛ рд╣реИред