рдЧреИрд░-рдХрдВрдкреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛: рд╕рдм рдХреБрдЫ рдЬреБрдЯрд╛рдирд╛

рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдЖрдк рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдкрдврд╝реЗрдВред рдпрд╣ рд▓реЗрдЦ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдХрдо рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

рднрд╡рд┐рд╖реНрдп рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрднреА рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡ рдмрдврд╝рд╛рдирд╛


class Liftable eff schema where lift :: eff ~> schema 

рд╕рд╛рд░ рдореЗрдВ "рдЙрддреНрдерд╛рди" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ? рд▓рд┐рдлреНрдЯ рдПрдХ рд╣реА рд╢реБрджреНрдз / рд░рд┐рдЯрд░реНрди рд╣реИ, рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд┐ рд╣рдо рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рд╡рд┐рд╕рд░реНрдЬрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдореЗрдВ рдкреНрд░рднрд╛рд╡ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ):

 pure :: a -> ta lift :: ua -> tua 

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

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдард╛рдП рдЧрдП рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 let f = lift get :: Configured _ t => t _ let g = lift Nothing :: Optional t => t _ let h = lift (failure _) :: Failable _ t => t _ let x = f *> g *> h :: (Applicative t, Configured _ t, Optional t, Failable _ t) => t _ 

рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ:

 let y = pure _ :: Reader _ :> State _ :> Either _ :> Maybe := Int let z = pure _ :: State _ :> Either _ :> Maybe _ :> Reader := _ let x = f *> g *> h :: (Applicative t, Configured _ t, Optional t, Failable _ t) => t _ let xy = x *> y :: Reader _ :> State _ :> Either _ :> Maybe := _ let xz = x *> z :: State _ :> Either _ :> Maybe _ :> Reader := _ 

рджреВрд╕рд░реЛрдВ рдкрд░ рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддреЗ рд╣реИрдВ


 class Adaptable subeff eff | subeff -> eff where adapt :: subeff ~> eff 

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

 lift put :: Accumulated _ t => t _ lift get :: Configured _ t => t _ (lift . adapt $ put) :: Stateful _ t => t _ (lift . adapt $ get) :: Stateful _ t => t _ 

рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ? рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд░рд╛рдЬреНрдп рдХреЛ рджреЛ рдкреНрд░рднрд╛рд╡реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ:

 State s = (->) s :. (,) s 

рд░реАрдбрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд░рд╛рдЬреНрдп рд╕реНрддрд░ рдкрд░ рдПрд░реЛ рдлрдВрдХреНрдЯрд░ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдФрд░ рд░рд╛рдЗрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯрдкрд░ рдлрдирдХрд╛рд░:

 Reader s = (->) s Writer s = (,) s 

рд╣рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рджреЗрдВрдЧреЗ:

 (lift $ Just _) :: Optional t => t _ (lift $ failure _) :: Failable _ t => t _ (lift . adapt $ failure _) :: Optional t => t _ 

рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдЪрд▓рд╛рдПрдБ


рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдореЗрдВ рдПрдХ рдкреНрд░рднрд╛рд╡ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд░рди рд╡рд┐рдзрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

 let xy = x *> y :: Reader _ :> State _ :> Either _ :> Maybe := _ let xy' = run xy _ :: State _ :> Either _ :> Maybe := _ let xy'' = run xy' _ :: Either _ :> Maybe := _ let xy''' = run xy'' :: Maybe (Either _) _ 

рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рдЙрджрд╛рд╣рд░рдг


рддреЛ, рдЕрднреА, рдмрд┐рдирд╛ рдореБрдлреНрдд / рдореБрдлреНрдд рдордареЛрдВ (рдФрд░ рдХрднреА-рдХрднреА рдмрд┐рдирд╛ рд╕рд╛рдзреБрдУрдВ рдХреЗ рднреА) рдХреЗ рд╕рд╛рде, рд╕рдВрдпреБрдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЕрдкрдиреЗ рднрд╛рд╡реЛрдВ рдХреЛ рдЙрдирдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдлрдВрдХреНрд╢рдВрд╕ рдХреА рдПрдХ рд░рдЪрдирд╛ рд╣реИред

рд░реЛрд╕реНрддреЛрд╡-рдСрди-рдбреЙрди рдХреА рдПрдХ рд╕реНрдерд╛рдиреАрдп рд░реИрд▓реА рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рднреА рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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


All Articles