рд╣рд╛рдБ, рд╣рд╛рдБ, рдЖрдкрдиреЗ рд╕рдкрдирд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рдЖрдкрдиреЗ рд╕рд╣реА рд╕реБрдирд╛ - рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред Kind рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╢рдмреНрдж рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ [рдбреЗрдЯрд╛] рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдХреБрдЫ рдЧреАрддред
рд╣реИрдмреЗ рдкрд░ рдХрдИ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдП рдереЗ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдкреНрд░рдЪрд╛рд░ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рдБрдЪ рд╕реЗрдВрдЯ рд╣реИред рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╕рддреНрдпрд╛рдкрди рд▓рд┐рдЦреЗрдВ
рдкреНрд░рдХрд╛рд░ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдорд╛рдиреНрдпрддрд╛ рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛:
type EmailContactInfo = String type PostalContactInfo = String data ContactInfo = EmailOnly EmailContactInfo | PostOnly PostalContactInfo | EmailAndPost (EmailContactInfo, PostalContactInfo) data Person = Person { pName :: String, , pContactInfo :: ContactInfo, }
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЧрд▓рдд рдбреЗрдЯрд╛ рдмрдирд╛рдирд╛ рдХреЗрд╡рд▓ рдЕрд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдорд╛рдиреНрдпрддрд╛ рдмрдирд╛рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рдирдЪрд░реНрдпрд╛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рд╣реИред
рдЙрдЪреНрдЪ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЕрд▓рдЧ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ:
data Person = Person { pName :: String , pAge :: Int }
рдФрд░ рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдорд╛рдиреНрдп рдХрд░реЗрдВрдЧреЗ рдЬрдм рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░ рдорд╛рдиреНрдп рд╣реЛрдВрдЧреЗред
рдЪреВрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рдмрд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рджрд┐рдирдЪрд░реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдмреАрдЪ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд░реНрдЪрд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реЗрдм рдлрд╝реЙрд░реНрдо рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЬрд╛рдирдХрд╛рд░реА рднрд░реЗрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╡реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рднрд░рдиреЗ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╢реЗрд╖ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрд╡реИрдз рдХрд░ рд░рд╣реЗ рд╣реЛрдВред рдпрджрд┐ рд╡реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реЗ рдврд╛рдВрдЪреЗ рдХреЛ рднрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рднрд░рд╛ рд╣реБрдЖ
рд╡реНрдпрдХреНрддрд┐ рдмреНрд░рд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдореЙрдбрд▓ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреВрд╕рд░реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:
data MaybePerson = MaybePerson { mpName :: Maybe String , mpAge :: Maybe Int }
рдЬрд╣рд╛рдВ, рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдпрд╣рд╛рдБ рд╕реЗ, рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
validate :: MaybePerson -> Maybe Person validate (MaybePerson name age) = Person <$> name <*> age
рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ (<$>) рдФрд░ (<*>)рдлрдВрдХреНрд╢рди
(<$>) рдлрдВрдорд░ рдлрдВрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ infix рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╣реИ
рдФрд░
(<*>) рдПрдкреЗрдХреНрдЯрд┐рд╡ рдлрд╝рдВрдХреНрдЯрд░ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ
рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ
рд╣рдорд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рде рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдЯреАрди рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛рдВрддреНрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рддреАрдиреЛрдВ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╕рд┐рдВрдХ рдореЗрдВ рд░рд╣реЗрдВред рдЕрдЧрд░ рдпрд╣ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛?
рд╣реИрд░рд╛рдиреА рдореЗрдВ рдбрд╛рд▓реЗрдВ! рд╡рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдПрдХ рд▓рдВрдмрд╛ рдкрд░рд┐рд╡рд╛рд░ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛!
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдПрдХ рдЬреАрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ, рдпрд╣ рдПрдХ
рдкреНрд░рдХрд╛рд░ рд╣реИ , рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЬреАрдирд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ [рдбреЗрдЯрд╛] рд╣реИред рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЬреАрдирд╕
* рд╣реИ , рдЬрд┐рд╕реЗ "рдЕрдВрддрд┐рдо" рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
ghci> :k Int Int :: * ghci> :k String String :: * ghci> :k Maybe Int Maybe Int :: * ghci> :k Maybe String Maybe String :: * ghci> :k [Int] [Int] :: *
рдФрд░
рд╢рд╛рдпрдж рдХрд┐рд╕ рддрд░рд╣ рдХрд╛?
ghci> :k Maybe Maybe :: * -> * ghci> :k [] [] :: * -> *
рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХрд▓, рдЙрдЪреНрдЪ
рд╢реНрд░реЗрдгреА рдХреЗ рдбреЗрдЯрд╛ рдХреЗ
рд╕рд╛рде рд╡реНрдпрдХреНрддрд┐ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
data Person' f = Person { pName :: f String , pAge :: f Int }
рдпрд╣рд╛рдБ рд╣рдо рдХреБрдЫ
' f (рд▓рд┐рдВрдЧ
* -> * ) рдХреЗ рд╕рд╛рде
рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
type Person = Person' Identity type MaybePerson = Person' Maybe
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╣рдЪрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣
рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░рд╛ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛
рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдХреЗ рдЕрдВрджрд░ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
ghci> :t pName @Identity pName :: Person -> Identity String ghci> :t runIdentity. pName runIdentity. pName :: Person -> String
рд╣рдо рдЗрд╕ рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рдХреЛ рддреБрдЪреНрдЫрддрд╛ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐
рд╡реНрдпрдХреНрддрд┐ рдХреА рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛
' рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ (рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ:
{-# LANGUAGE TypeFamilies #-}
рд╣рдореЗрдВ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП
рдЬреЗрдиреЗрд░рд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
HKD рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ GHC рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ:
ghci> :t pName @Identity pName :: Person -> String ghci> :t pName @Maybe pName :: Person -> Maybe String
рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡
рдореЗрдВ рдЙрдЪреНрдЪрддрдо рдкреНрд░рдХрд╛рд░ рдХреЗ
рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдореВрд▓ рдПрдХ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдкрд╖реНрдЯ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╛рд░рд╛ рдХрд╛рдо рдЦрд░реАрджрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╢рдмреНрдж рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред
рдЕрдм рд╣рдо рдЕрдкрдиреА рдирдИ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
validate :: Person' Maybe -> Maybe Person validate (Person name age) = Person <$> name <*> age
рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ? рд▓реЗрдХрд┐рди рд╕рд╛рдЬрд╝рд┐рд╢ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреИрдЯрд░реНрди рд╣рдорд╛рд░реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдЬреЛ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдм рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ
рд╡реНрдпрдХреНрддрд┐ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐
рдкреАрдЯрд░рд╕рди рдХреЛ рд╕рдореЗрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЕрдм рдХреЗрд╡рд▓ рд╕рд╛рдВрдХреЗрддрд┐рдХ рдЕрд░реНрдереЛрдВ рдореЗрдВ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВред
рдЬреЗрдирд░рд┐рдХ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди
рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдХреЛрдб рдХрд╛рдлреА рдирд┐рдпрдорд┐рдд рд╣реЛред
рд╣рдо рдПрдХ рд╕рддреНрдпрд╛рдкрди рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдЙрдЪреНрдЪ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЪрд░рдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдЧреБрдкреНрдд
GHC.Generics рд╕реЗ рд╕рдВрдкрд░реНрдХ
рдХрд░рдирд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдПрдХ рд╕рдорд░реВрдкрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд: рд╣рдореЗрдВред) рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рддрд╛рдХрд┐ рд╣рдо рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрдп рдФрд░ рдХреЙрдкреНрдЯрд░ рдХреЛ рдмрджрд▓ рд╕рдХреЗрдВред GHC рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╕рд╛рдл рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдкреИрд░ рдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЛ рдЧреБрджрдЧреБрджреА рдХрд░реЗрдЧреА рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
validate :: _ => d Maybe -> Maybe (d Identity)
рдЬреЗрдирд░рд┐рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ
, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЕрд░реНрдерд╛рддреН, рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рддрд░реНрдХ-рдореБрдХреНрдд рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдирд┐рд░рдВрддрд░ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдореЗрдЯрд╛-рд╕реВрдЪрдирд╛рддреНрдордХ (рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛, рдЖрджрд┐) рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рдВрдШреЛрдВ - рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрд▓ рдпрд╛ рд╕рдВрдЧрдарди OR-OR рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб, рд╡реЗ рднреА рд▓рдШреБ-рд░реВрдк рд╕рдВрдШ рдпрд╛ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рд╣реЛрдЧрд╛ред рдЕрдиреБрднрд╡ рд╕реЗ, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ - рдЗрди рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдмреЗрд╣рдж рд╕рд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЪрд▓реЛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
{-# LANGUAGE MultiParamTypeClasses #-} class GValidate io where gvalidate :: ip -> Maybe (op)
рдЖрдк рдЕрдкрдиреЗ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк "рдирд░рдо рдФрд░ рдзреАрдореЗ" рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдкрдХреЛ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрди рджреЛрдиреЛрдВ рдХреЛ рдЬреАрдирд╕
* -> * рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдЕрд╕реНрддрд┐рддреНрд╡рд╣реАрди
рдкреА рдХреЛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдирд╛, рдЕрдВрдзреЗрд░реЗ, рдЕрдкрд╡рд┐рддреНрд░ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдорд╛рдирд╡ рдЬрд╛рддрд┐ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛрдирд╛ред рдлрд┐рд░, рдПрдХ рдЫреЛрдЯреА рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕ рднрдпрд╛рдирдХ рдирд╛рд░рдХреАрдп рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╣рдорд╛рд░реЗ рд╕рд┐рд░ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдПрдВрдЧреЗред
рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ
GHC.Generic рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЖрдзрд╛рд░ рдорд╛рдорд▓реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН
рд╢рд╛рдпрдж k :
{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE TypeOperators #-} instance GValidate (K1 a (Maybe k)) (K1 ak) where
K1 рдПрдХ "рдирд┐рд░рдВрддрд░ рдкреНрд░рдХрд╛рд░" рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рд╣рдорд╛рд░реЗ
рд╡реНрдпрдХреНрддрд┐ 'рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
, рдпрд╣
pName :: HKD f String рд╣реЛрдЧрд╛ ред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдзрд╛рд░ рдорд╛рдорд▓рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмрд╛рдХреА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛рдВрддреНрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддрдм рддрдХ рдпреЗ рдЙрджрд╛рд╣рд░рдг рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рддреБрдЪреНрдЫ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдореНрд╕ рд╣реЛрдВрдЧреЗред
рд╣рдо рдЧреБрдгрд╛рддреНрдордХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
GValidate io рдФрд░
GValidate i 'o' рд╣реИрдВ , рддреЛ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
instance (GValidate io, GValidate i' o') => GValidate (i :*: i') (o :*: o') where gvalidate (l :*: r) = (:*:) <$> gvalidate l <*> gvalidate r {-# INLINE gvalidate #-}
рдпрджрд┐
K1 рд╣рдорд╛рд░реЗ
рд╡реНрдпрдХреНрддрд┐ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, (: *: :) рд▓рдЧрднрдЧ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдкреНрд░рддрд┐рд░реВрдк рдпрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди
GValidate рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдбреЗрдЯрд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рди рдЕрд▓рдЧ рд╣реЛ рдЧрдП рд╣реИрдВ)
instance (GValidate io, GValidate i' o') => GValidate (i :+: i') (o :+: o') where gvalidate (L1 l) = L1 <$> gvalidate l gvalidate (R1 r) = R1 <$> gvalidate r {-# INLINE gvalidate #-}
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╕реЗ рд╣рдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдмрд╕ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдкрд░
GValidate io рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
instance GValidate io => GValidate (M1 _a _b i) (M1 _a' _b' o) where gvalidate (M1 x) = M1 <$> gvalidate x {-# INLINE gvalidate #-}
рдЕрдм рд╣рдо рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдмрд╛рдз рд╕рдВрд░рдЪрдирд╛рдУрдВ рд╕реЗ рдмрдЪреЗ рд╣реИрдВред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЧреИрд░-рдЖрд╡рд╛рд╕реАрдп рдкреНрд░рдХрд╛рд░ (
V1 ) рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ (
U1 ) рдХреЗ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреБрдЪреНрдЫ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ:
instance GValidate V1 V1 where gvalidate = undefined {-# INLINE gvalidate #-} instance GValidate U1 U1 where gvalidate U1 = Just U1 {-# INLINE gvalidate #-}
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╣рд╛рдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓
рд╡реА 1 рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП,
V1 рдирд┐рд░реНрдЬрди рдФрд░ рдирд┐рд░реНрдЬрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдиреИрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИрдВред
рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд┐рдирд╛, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдкреВрд░рд╛ рддрдВрддреНрд░ рд╣реИ, рд╣рдо рдЕрдВрддрддрдГ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдПрдХ рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
{-# LANGUAGE FlexibleContexts #-} validate :: ( Generic (f Maybe) , Generic (f Identity) , GValidate (Rep (f Maybe)) (Rep (f Identity)) ) => f Maybe -> Maybe (f Identity) validate = fmap to . gvalidate . from
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдВрдмреЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдореБрд╕реНрдХрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХрд╛рдо рдкрд░ рд░рдЦрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ
рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ
' ; рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рджреЗрдЦрд╛!
рдкрд░рд┐рдгрд╛рдо
рдЖрдЬ рдХреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╣рдо рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдзрд┐рдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЪреАрдЬреЗрдВ рд╕рдВрднрд╡ рд╣реИрдВ, рдЗрд╕рдХреА рдПрдХ рдЭрд▓рдХ рднреА рдкрдХрдбрд╝реАред
рдпрд╣ рдЖрдкрдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ: рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдордирдорд╛рдиреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдВрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛; рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛
рдЕрдиреБрдХреНрд░рдо ; рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред
рдЙрдЪреНрдЪ рдкреНрд░рд╕рд╡ рдХреЗ рдЦреБрд╢ рдЖрд╡реЗрджрди!
рдореВрд▓: рдЙрдЪреНрдЪ-рдХрд┐рдиреНрдб рдбреЗрдЯрд╛