рдкрд░рд┐рдЪрдп
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдпрд╣ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдЬрд┐рдирдХреА рд╡рд╕реНрддреБрдПрдВ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрд╕ рд╕рдордп рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рдЬрдм рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░
рд╢рд╛рдпрдж рдП рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреБрдЫ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕реЗ рд╕рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рд╣рдорд╛рд░рд╛ рд╕рд╛рд░рд╛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд
рдХрд░рддреЗ рд╣реИрдВ ред
рд╕реВрдЪреА рдХреЗ рд╕рд╛рде
рдПрдХ рд╣реА рдХрд╣рд╛рдиреА -
a рдХрд╛ рдмрд╣реБрд╡рдЪрди рдореВрд▓реНрдп;
рд░рд╛рдЬреНрдп рд╕рд╛ -
рдП , рдХреБрдЫ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ;
рдпрд╛ рддреЛ рдИ -
рдП , рдЬреЛ рдХреБрдЫ рддреНрд░реБрдЯрд┐
рдИ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд▓реЗрдЦ рдХрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:
type (:=) ta = ta
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рд╕реВрдЪреА:ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: = a - рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрд╣ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рдирдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЪрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
рд░реАрдбрд░ ,
рд╕реНрдЯреЗрдЯ ,
рдИрдпрд░ ,
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред
рд░рдЪрдирд╛рдПрдБ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд░
рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдмрд╕ рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд░рдЪрдирд╛ рд╣реИред рд░рдЪрдирд╛рдУрдВ рдореЗрдВ, рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЙрдирдХреЗ рдКрдкрд░
рдЯреНрд░реИрд╡рд░реНрд╕реЗрдмрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдФрд░ рдХрдИ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
рд░рдЪрдирд╛рдУрдВ:
- рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
- рдлрд╝рдирдХрд╛рд░ / рдЖрд╡реЗрджрдХ / рдореЛрдирд╛рдб рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ
- рд╕рдм рдХреБрдЫ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд░рдЪрдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдореЛрдирд╛рдбреНрд╕ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ
рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░:
- рдЖрдкрдХреЛ рдХрдИ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
- рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╕рдмрд╕реЗ рдЕрдХреНрд╕рд░ рдХреБрдЫ рдирдП рдЯрд╛рдЗрдк)
- рд▓рд┐рдлреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рдЖрдк рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрдЯреИрдХ рдХреА рдХрд┐рд╕реА рднреА рдкрд░рдд рдкрд░ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рд╣реИрдВ
рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреНрд▓рдЪ рд░рдЪрдирд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ (рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рдП)ред рдХреБрдЫ рд░рдЪрдирд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдбреЙрдХрд┐рдВрдЧ рд╕реНрдХреАрдо рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред
рдбреЙрдХрд┐рдВрдЧ рд╕реНрдХреАрдо
рдпрджрд┐ рд╣рдо monad рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рддреЛ рд╣рдо рдХреБрдЫ рдкреИрдЯрд░реНрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
newtype ReaderT rma = ReaderT { runReaderT :: r -> ma } newtype MaybeT ma = MaybeT { runMaybeT :: m (Maybe a) } newtype ExceptT ema = ExceptT { runExceptT :: m (Either ea)) } newtype StateT sma = StateT { runStateT :: s -> m (a,s) }
рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд╡рд░реНрддрдорд╛рди рдирд┐рд╢реНрдЪрд┐рдд рдФрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдХреЛ рдЬрд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЪрд▓реЛ рдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рдФрд░
рдпреВ рдЕрдирд┐рд╢реНрдЪрд┐рддрдХрд╛рд▓реАрди рд╣реЛ, рдХреЛрд╢рд┐рд╢ рдХрд░реЛ:
Reader: r -> ua ===> (->) r :. u := a ===> t :. u := a
рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдХреА рд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд░рд▓ рдкреНрд░рднрд╛рд╡:
State: s -> u (a, s) ===> (->) s :. (,) s := a ==> t :. u :. t' := a
рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ 3 рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдорд╛рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдпрджрд┐
рд░реАрдбрд░ рдореЗрдВ , рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдЕрдирд┐рд╢реНрдЪрд┐рддрдХрд╛рд▓реАрди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ рдХреЛрд╖реНрдардХ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рдмрди рдЬрд╛рддрд╛ рд╣реИ), рддреЛ
рдпрд╛ рддреЛ рдФрд░
рд╢рд╛рдпрдж рдпрд╣ рд╡рд┐рдкрд░реАрдд рд╣реИ - рдПрдХ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред
рд░рд╛рдЬреНрдп рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
, рд╣рдо рднреА рджреЛ рд╕рд░рд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ рдлрд╝рдирдХрд╛рд░ рдХреЛ рд░рдЦрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЗрди рдкреИрдЯрд░реНрдиреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
newtype TU tua = TU (t :. u := a) newtype UT tua = UT (u :. t := a) newtype TUT tut' a = TUT (t :. u :. t' := a)
рд╣рдордиреЗ рдХреЗрд╡рд▓ рдбреЙрдХрд┐рдВрдЧ рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ - рдпрд╣ рдПрдХ рдЖрд╡рд░рдг рдореЗрдВ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рдПрдХ рд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬрд┐рдирдХреЗ рдирд╛рдо
рд░рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ
рд╣реИрдВ , рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рдЖрд╡рд░рдг рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
class Composition t where type Primary ta :: * run :: ta -> Primary ta
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрди рд╕рд░реНрдХрд┐рдЯреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рд╣реИ:
instance Composition (TU tu) where type Primary (TU tu) a = t :. u := a run (TU x) = x instance Composition (UT tu) where type Primary (UT tu) a = u :. t := a run (UT x) = x instance Composition (TUT tu t') where type Primary (TUT tu t') a = t :. u :. t' := a run (TUT x) = x
рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣рд╛рдВ, рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдбреЙрдХрд┐рдВрдЧ рдпреЛрдЬрдирд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рднрд╛рд╡ рдХрд╛
рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИ:
class Composition t => Transformer t where type Schema (t :: * -> *) (u :: * -> *) = (r :: * -> *) | r -> tu embed :: Functor u => u ~> Schema tu build :: Applicative u => t ~> Schema tu type (:>) tua = Transformer t => Schema tua
рдЕрдм рдпрд╣ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ,
рд╢рд╛рдпрдж рдФрд░ рдХрд╣реАрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
instance Transformer Maybe where type Schema Maybe u = UT Maybe u embed x = UT $ Just <$> x build x = UT . pure $ x instance Transformer (Either e) where type Schema (Either e) u = UT (Either e) u embed x = UT $ Right <$> x build x = UT . pure $ x
рд╣рдо
рд░реАрдбрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣
рдЖрдзрд╛рд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЙрд╕реЗ
рд░рдЪрдирд╛ рд╡рд░реНрдЧ рдХреА рднреА рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреАрд░ рдлрдВрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИ:
newtype Reader ea = Reader (e -> a) instance Composition (Reader e) where type Primary (Reader e) a = (->) ea run (Reader x) = x instance Transformer (Reader e) where type Schema (Reader e) u = TU ((->) e) u embed x = TU . const $ x build x = TU $ pure <$> run x
рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ:
newtype State sa = State ((->) s :. (,) s := a) instance Composition (State s) where type Primary (State s) a = (->) s :. (,) s := a run (State x) = x instance Transformer (State s) where type Schema (State s) u = TUT ((->) s) u ((,) s) embed x = TUT $ \s -> (s,) <$> x build x = TUT $ pure <$> run x
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ
рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ - рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╣реА рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
рдХреЛрд╖реНрдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░: рд╡реЗ рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ; рдФрд░ рднреА рдЕрд▓рдЧ рд╢реИрд▓реА рд╣реИ:
data Shape = Opened | Closed data Style = Round | Square | Angle | Curly
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдиреНрдп рдкреНрд░рддреАрдХ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВ:
data Symbol = Nevermind | Bracket Style Shape
рд╣рдо рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВ:
data Stumble = Deadend (Int, Style)
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрд┐рди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреА рдПрдХ рд╕реВрдЪреА рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдИ рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рддреЗ рд╣реИрдВ:
State [(Int, Style)] :> Either Stumble := ()
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реИ: рд╣рдо рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд░рд╛рдЬреНрдп рдореЗрдВ рдмреНрд░реИрдХреЗрдЯ рд╣реИрдВ, рддреЛ рдЦреБрд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдПрдХ рдмрдВрдж рдирд╣реАрдВ рд╣реИ:
checking :: Traversable t => t (Int, Symbol) -> Either Stumble () checking struct = run (traverse proceed struct) [] >>= \case (s : _, _) -> Left . Logjam $ s where ([], _) -> Right ()
рд╣рдо рдХрд┐рд╕реА рднреА рдЦреБрд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдкрд┐рдЫрд▓реЗ рдпрд╛рдж рдХрд┐рдП рдЧрдП рдУрдкрди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдмрдВрдж рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
proceed :: (Int, Symbol) -> State [(Int, Style)] :> Either Stumble := () proceed (_, Nevermind) = pure () proceed (n, Bracket style Opened) = build . modify . (:) $ (n, style) procceed (n, Bracket closed Closed) = build get >>= \case []-> embed $ Left . Deadend $ (n, closed) ((m, opened) : ss) -> if closed /= opened then embed . Left $ Mismatch (m, opened) (n, closed) else build $ put ss where
рдирд┐рд╖реНрдХрд░реНрд╖
рдбреЙрдХрд┐рдВрдЧ рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рдХреБрдЫ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЛрдорд░реНрд╕ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд╛рд▓ рдореЛрдирд╛рдбреНрд╕ - рд╕реАрдХреНрд╡реЗрд▓ рдХреА рдорд╛рдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдлреЗрд╕рд░ рдХреА рд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ ... рдФрд░ рдлрд┐рд░ рднреА, рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИред
Github рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб |
рд╣реИрдХреЗрдЬ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди |
рдХреЛрд╖реНрдардХ рдЙрджрд╛рд╣рд░рдг