рдЙрдЪреНрдЪ рдбреЗрдЯрд╛

рд╣рд╛рдБ, рд╣рд╛рдБ, рдЖрдкрдиреЗ рд╕рдкрдирд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рдЖрдкрдиреЗ рд╕рд╣реА рд╕реБрдирд╛ - рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред 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  } 

рдЬрд╣рд╛рдВ, рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 -- already in Prelude data Maybe a = Nothing | Just a 

рдпрд╣рд╛рдБ рд╕реЗ, рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:

 validate :: MaybePerson -> Maybe Person validate (MaybePerson name age) =  Person <$> name <*> age 

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ (<$>) рдФрд░ (<*>)
рдлрдВрдХреНрд╢рди (<$>) рдлрдВрдорд░ рдлрдВрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ infix рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╣реИ

 -- already in Prelude fmap :: Functor f => (a -> b) -> fa -> fb (<$>) :: Functor f => (a -> b) -> fa -> fb (<$>) = fmap 

рдФрд░ (<*>) рдПрдкреЗрдХреНрдЯрд┐рд╡ рдлрд╝рдВрдХреНрдЯрд░ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ

 -- already in Prelude (<*>) :: Applicative f => f (a -> b) -> fa -> fb 

рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ

 -- already in Prelude (<$>) :: (a -> b) -> Maybe a -> Maybe b _ <$> Nothing = Nothing f <$> (Just a) = Just (fa) (<*>) :: Maybe (a -> b) -> Maybe a -> Maybe b (Just f) <*> m = f <$> m Nothing <*> _ = Nothing 


рд╣рдорд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рде рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдЯреАрди рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛рдВрддреНрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рддреАрдиреЛрдВ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╕рд┐рдВрдХ рдореЗрдВ рд░рд╣реЗрдВред рдЕрдЧрд░ рдпрд╣ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛?

рд╣реИрд░рд╛рдиреА рдореЗрдВ рдбрд╛рд▓реЗрдВ! рд╡рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдПрдХ рд▓рдВрдмрд╛ рдкрд░рд┐рд╡рд╛рд░ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛!

рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдПрдХ рдЬреАрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ, рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ , рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЬреАрдирд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ [рдбреЗрдЯрд╛] рд╣реИред рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЬреАрдирд╕ * рд╣реИ , рдЬрд┐рд╕реЗ "рдЕрдВрддрд┐рдо" рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

 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 

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╣рдЪрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

 -- already in Prelude newtype Identity a = Identity { runIdentity :: a } 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░рд╛ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдХреЗ рдЕрдВрджрд░ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 ghci> :t pName @Identity pName :: Person -> Identity String ghci> :t runIdentity. pName runIdentity. pName :: Person -> String 

рд╣рдо рдЗрд╕ рдЭреБрдВрдЭрд▓рд╛рд╣рдЯ рдХреЛ рддреБрдЪреНрдЫрддрд╛ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡реНрдпрдХреНрддрд┐ рдХреА рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ ' рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ (рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ:

 {-# LANGUAGE TypeFamilies #-} -- "Higher-Kinded Data" type family HKD fa where HKD Identity a = a HKD fa = fa data Person' f = Person  { pName :: HKD f String  , pAge :: HKD f Int  } deriving (Generic) 

рд╣рдореЗрдВ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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) 

рдЬреЗрдирд░рд┐рдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ , рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 -- undefined data, lifted version of Empty data V1 p -- Unit: used for constructors without arguments, lifted version of () data U1 p = U1 -- a container for ac, Constants, additional parameters and recursion of kind * newtype K1 icp = K1 { unK1 :: c } -- a wrapper, Meta-information (constructor names, etc.) newtype M1 itfp = M1 { unM1 :: fp } -- Sums: encode choice between constructors, lifted version of Either data (:+:) fgp = L1 (fp) | R1 (gp) -- Products: encode multiple arguments to constructors, lifted version of (,) data (:*:) fgp = (fp) :*: (gp) 

рдЕрд░реНрдерд╛рддреН, рдЧреИрд░-рдЖрд░рдВрднрд┐рдХ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рддрд░реНрдХ-рдореБрдХреНрдд рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдирд┐рд░рдВрддрд░ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдореЗрдЯрд╛-рд╕реВрдЪрдирд╛рддреНрдордХ (рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛, рдЖрджрд┐) рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рдВрдШреЛрдВ - рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрд▓ рдпрд╛ рд╕рдВрдЧрдарди 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 -- gvalidate :: K1 a (Maybe k) -> Maybe (K1 ak) gvalidate (K1 k) = K1 <$> k {-# INLINE gvalidate #-} 

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 

рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдВрдмреЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдореБрд╕реНрдХрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХрд╛рдо рдкрд░ рд░рдЦрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ ' ; рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рджреЗрдЦрд╛!

рдкрд░рд┐рдгрд╛рдо


рдЖрдЬ рдХреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╣рдо рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдзрд┐рдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЪреАрдЬреЗрдВ рд╕рдВрднрд╡ рд╣реИрдВ, рдЗрд╕рдХреА рдПрдХ рдЭрд▓рдХ рднреА рдкрдХрдбрд╝реАред

рдпрд╣ рдЖрдкрдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ: рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдордирдорд╛рдиреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдВрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛; рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХреНрд░рдо ; рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред

рдЙрдЪреНрдЪ рдкреНрд░рд╕рд╡ рдХреЗ рдЦреБрд╢ рдЖрд╡реЗрджрди!

рдореВрд▓: рдЙрдЪреНрдЪ-рдХрд┐рдиреНрдб рдбреЗрдЯрд╛

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


All Articles