рд╣рд╛рдл рд░рд┐рдВрдЧреНрд╕ рдХреА рдХрд╣рд╛рдиреА

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓реБрдХрд╛ рдЬреИрдХрдмреЛрд╡рд┐рддреНрдЬ рдХреЗ рд▓реЗрдЦ "рдП рд╕реНрдЯреЛрд░реА рдСрди рд╕реЗрдорд░рд┐рдВрдЧреНрд╕" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реВрдВред


рдХрднреА рдЖрдкрдиреЗ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдпреЛрдЧ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛ рд╢рд╛рдпрдж рдЖрдк рд╣рдореЗрд╢рд╛ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ <*> рдСрдкрд░реЗрдЯрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдФрд░ рдЖрдзреЗ рдЫрд▓реНрд▓реЗ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдЗрдЪреНрдЫреБрдХ рдХреГрдкрдпрд╛ рдПрдХ рдХрдЯ рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ!


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


рдмреАрдЬрдЧрдгрд┐рддреАрдп рд╕рдВрд░рдЪрдирд╛рдПрдБ


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


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


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


[ рдиреЛрдЯ: рдЪреВрдВрдХрд┐ "рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ" рдирд╛рдо рд░реВрд╕реА рдореЗрдВ рдореВрд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ ]


 import simulacrum._ @typeclass trait AdditiveSemigroup[A] { def +(x: A)(y: A): A } @typeclass trait AdditiveMonoid[A] extends AdditiveSemigroup[A] { def zero: A } @typeclass trait MultiplicativeSemigroup[A] { def *(x: A)(y: A): A } @typeclass trait MultiplicativeMonoid[A] extends MultiplicativeSemigroup[A] { def one: A } 

[ рдиреЛрдЯ: simulacrum рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ @typeclass рдПрдиреЛрдЯреЗрд╢рди рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдХреЗ рддрд╛рд░реНрдХрд┐рдХ рдШрдЯрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ]


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Semiring ( Semiring ) рдПрдХ рдПрдбрд┐рдЯрд┐рд╡ Semiring ( AdditiveMonoid ) рд╣реИ, рдЬреЛ рдХрд┐ Semiring ( MultiplicativeMonoid ) рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдиреВрдиреЛрдВ рд╕реЗ рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реИ:


  1. рдпреЛрдЬрдХ рдХрдореНрдпреВрдЯрд┐рдЯреА: x+y=y+x
  2. рджрд╛рдИрдВ рдУрд░ рд╡рд┐рддрд░рдг: (x+y) рдЧреБрдирд╛z=(x рдЯрд╛рдЗрдореНрд╕z)+(y рдЯрд╛рдЗрдореНрд╕z)рдЧреБрдирд╛рдЯрд╛рдЗрдореНрд╕рдЯрд╛рдЗрдореНрд╕
  3. рдмрд╛рдИрдВ рдУрд░ рд╡рд┐рддрд░рдг: x рдЧреБрдирд╛(y+z)=(x timesy)+(x timesz)рдЧреБрдирд╛
  4. рджрд╛рдИрдВ рдУрд░ рд╢реВрдиреНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐: x рдЧреБрдирд╛рд╢реВрдиреНрдп=рд╢реВрдиреНрдпрдЧреБрдирд╛рд╢реВрдиреНрдпрд╢реВрдиреНрдп
  5. рдмрд╛рдИрдВ рдУрд░ рд╢реВрдиреНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐: рд╢реВрдиреНрдп рдЧреБрдирд╛x=рд╢реВрдиреНрдпрд╢реВрдиреНрдпрдЧреБрдирд╛рд╢реВрдиреНрдп

рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрдЧрдд рд╕реЗрдорд┐рдирд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AdditiveMonoid рдФрд░ MultiplicativeMonoid рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ:


 @typeclass trait Semiring[A] extends MultiplicativeMonoid[A] with AdditiveMonoid[A] 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Semiring , рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: Int , Long , BigDecimal , рдЖрджрд┐, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдзреЗ рдЫрд▓реНрд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реЗ рд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рднреА рдЖрдзреЗ рдЫрд▓реНрд▓реЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдп, рд╕реЗрдЯ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдирд┐рдореЗрд╢рди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдПрдХ рдЕрд░реНрдз-рд░рд┐рдВрдЧ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдареАрдХ рд╣реИ, рдзреИрд░реНрдп рд░рдЦреЗрдВ рдФрд░ рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред


рдХрд╛рд░реНрдбрд┐рдирд▓ рдирдВрдмрд░


рдЖрдЗрдП рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ рдХрд╛рд░реНрдбрд┐рдирд▓ рдирдВрдмрд░ рд╕реЗ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдЙрди рдорд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Boolean рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдбрд┐рдирд▓ рдирдВрдмрд░ рд╣реЛрддрд╛ рд╣реИ 2 рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдХреЗрд╡рд▓ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рд╣реИрдВ: true рдФрд░ false ред


рддреЛ, Boolean - 2 , рд▓реЗрдХрд┐рди рдХрд┐рддрдиреЗ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░? Byte - 28 , Short - 216 Int - 232 рдФрд░ Long 264 ред рддрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? String рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдирдВрдд рд╕реНрдореГрддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреА)ред


рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрдирдХреА рдХрд╛рд░реНрдбрд┐рдирд▓ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рджреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг: Unit , рдЬрд┐рд╕рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИ, рдФрд░ Nothing , рдЬреЛ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рд╣реИ 0 рд╕рдВрднрд╡ рдорд╛рдиред рдпрд╣реА рд╣реИ, рдЖрдк рдХрднреА Nothing рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╛рд░реНрдбрд┐рдирд▓ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ 0 ред


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


 trait Cardinality[A] { def cardinality: BigInt } object Cardinality { def of[A: Cardinality]: BigInt = apply[A].cardinality def apply[A: Cardinality]: Cardinality[A] = implicitly } 

рдЕрдм рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:


 implicit def booleanCardinality = new Cardinality[Boolean] { def cardinality: BigInt = BigInt(2) } implicit def longCardinality = new Cardinality[Long] { def cardinality: BigInt = BigInt(2).pow(64) } implicit def intCardinality = new Cardinality[Int] { def cardinality: BigInt = BigInt(2).pow(32) } implicit def shortCardinality = new Cardinality[Short] { def cardinality: BigInt = BigInt(2).pow(16) } implicit def byteCardinality = new Cardinality[Byte] { def cardinality: BigInt = BigInt(2).pow(8) } implicit def unitCardinality = new Cardinality[Unit] { def cardinality: BigInt = 1 } implicit def nothingCardinality = new Cardinality[Nothing] { def cardinality: BigInt = 0 } 

[ рдиреЛрдЯ: рджрд┐рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА implicit val рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ]


рдЖрдЗрдП, REPL рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрдЬрд╝рдорд╛рдПрдБ:


 scala> Cardinality.of[Int] res11: BigInt = 4294967296 scala> Cardinality.of[Unit] res12: BigInt = 1 scala> Cardinality.of[Long] res13: BigInt = 18446744073709551616 

рдорд╣рд╛рди, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдПрдбреАрдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдХреНрдпрд╛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдмрд╕ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╕рд░рд▓рддрдо рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрддреНрдкрд╛рдж рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: (Boolean, Byte)


рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рддрдиреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИрдВ? рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ Boolean рдЙрдирдХреЗ Boolean рд╣реИ 2 рдФрд░ Byte 256 ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реЗ рд╕рдВрдЦреНрдпрд╛ тИТ128 рдХреЛ 127 true рдпрд╛ false рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрддред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ 512 рдЕрджреНрд╡рд┐рддреАрдп рдореВрд▓реНрдпред


512 рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ 256 рд╕реЗ рдЧреБрдгрд╛ 2 , рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ? рдпрджрд┐ рдЖрдк рдмрд╛рдХреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рдЪ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╢реНрд░реЗрдгреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВ:


 implicit def tupleCardinality[A: Cardinality, B: Cardinality] = new Cardinality[(A, B)] { def cardinality: BigInt = Cardinality[A].cardinality * Cardinality[B].cardinality } 

рдЕрдм рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: Either[Boolean, Byte] ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрддреНрддрд░ рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдп (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ) Boolean рдпрд╛ Byte рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рд░реНрдбрд┐рдирд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рддреЛ Either[Boolean, Byte ] рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП 256+2=$25 рдкреНрд░рддрд┐рдирд┐рдзрд┐ред


рдЖрдЗрдП рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ REPL рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВ:


 implicit def eitherCardinality[A: Cardinality, B: Cardinality] = new Cardinality[Either[A, B]] { def cardinality: BigInt = Cardinality[A].cardinality + Cardinality[B].cardinality } scala> Cardinality.of[(Boolean, Byte)] res14: BigInt = 512 scala> Cardinality.of[Either[Boolean, Byte]] res15: BigInt = 258 scala> Cardinality.of[Either[Int, (Boolean, Unit)]] res16: BigInt = 4294967298 

рдирддреАрдЬрддрди, рдХрд╛рд░реНрдбрд┐рдирд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдЙрдирдХреЗ рдирд╛рдо рджрд┐рдП рдЧрдПред


рддреЛ рд╣реЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдЪрд░реНрдЪрд╛ рд╣реБрдИ? рдПрдХ рд╕рдорд░реВрдкрддрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛-рд╕рдВрд░рдХреНрд╖рдг рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдмреАрдЬрдЧрдгрд┐рддреАрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╣реЛрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд░реНрдзрд╕реВрддреНрд░реАрд╡рд┐рднрд╛рдЬрди)ред


рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА x ред рдп рдФрд░ рд╕рдорд▓реИрдВрдЧрд┐рдХрддрд╛ рдЪ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:


  1. f(x рдЯрд╛рдЗрдореНрд╕y)=f(x) рдЧреБрдирд╛f(y)
  2. f(x+y)=f(x)+f(y)

рдмрд╛рдж рдХреЗ рднрд╛рд╡ рдХрд╛рдлреА рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ред рдпрджрд┐ рд╣рдо рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ Byte рдФрд░ Boolean рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо Either[Byte, Boolean] , рдФрд░ рдЕрдЧрд░ рд╣рдо рдХрд╛рд░реНрдбрд┐рдиреИрд▓рд┐рдЯреА рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ 258 ред рдпрд╣ Byte рдФрд░ Boolean рд▓рд┐рдП Byte рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред


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


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ, рдЯрд╛рдЗрдк Unit рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдк Nothing рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣рдо рдЗрди рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдзрд╛ рд░рд┐рдВрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?


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


 scala> Cardinality.of[Int] res17: BigInt = 4294967296 scala> Cardinality.of[(Unit, Int)] res18: BigInt = 4294967296 scala> Cardinality.of[(Unit, (Unit, Int))] res19: BigInt = 4294967296 

Nothing рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдХрд╛рдИ рд╣реИ, Nothing рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдпреЛрдЧ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Either[Nothing, A] рдореИрдЪ A ? рд╣рд╛рдБ! рдЪреВрдВрдХрд┐ Nothing рднреА рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, Either[Nothing, A] рдХреЗрд╡рд▓ Right рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреЗрд╡рд▓ A , рдЗрд╕рд▓рд┐рдП рдпреЗ рдкреНрд░рдХрд╛рд░ рд╕рдорддреБрд▓реНрдп рд╣реИрдВред


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


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдбрд┐рдирд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреА рдЗрдХрд╛рдИ:


 scala> Cardinality.of[Either[Nothing, Boolean]] res0: BigInt = 2 scala> Cardinality.of[Either[Nothing, (Byte, Boolean)]] res1: BigInt = 258 

рд╢реВрдиреНрдп рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд╢реЛрд╖рдг:


 scala> Cardinality.of[(Nothing, Boolean)] res0: BigInt = 0 scala> Cardinality.of[(Nothing, Long)] res1: BigInt = 0 

рдпрд╣ рд╡рд┐рддрд░рдг рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ (A, Either[B, C]) рдХреЛ Either[(A, B), (A, C)] рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордХрдХреНрд╖ рд╣реЛрдВрдЧреЗред


 scala> Cardinality.of[(Boolean, Either[Byte, Short])] res20: BigInt = 131584 scala> Cardinality.of[Either[(Boolean, Byte), (Boolean, Short)]] res21: BigInt = 131584 

рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреА рдмреАрдЬрдЧрдгрд┐рддреАрдп рд╕рдВрд░рдЪрдирд╛рдПрдВ


рдХреБрдЫ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Semigroupal рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ Semigroup рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ? рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП Semigroupal рд╣реА рдирдЬрд╝рд░ Semigroupal рд╣реИрдВ:


 @typeclass trait Semigroupal[F[_]] { def product[A, B](fa: F[A], fb: F[B]): F[(A, B)] } 

Semigroup рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдорд╛рдирддрд╛ рд╣реИ: рджреЛ рдорд╛рди рд╕рдВрдпреБрдХреНрдд рд╣реИрдВ, рдФрд░ рдЗрд╕реА рдСрдкрд░реЗрд╢рди рдХреЛ рдПрд╕реЛрд╕рд┐рдПрдЯрд┐рд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ( Semigroup рд╕рдорд╛рди)ред


рдЕрдм рддрдХ, рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо product рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рд╣реИред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо A рдФрд░ B рдХреЛ рдПрдХ рдЯрдкрд▓ рдореЗрдВ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЙрддреНрдкрд╛рдж рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдордирдорд╛рдирд╛ Semigroupal , рд▓реЗрдХрд┐рди рдЧреБрдгрдХ рд╣реИ? рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред


 @typeclass trait MultiplicativeSemigroupal[F[_]] { def product[A, B](fa: F[A], fb: F[B]): F[(A, B)] } 

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Semigroupal рдХреНрдпрд╛ Semigroupal рд╕рдХрддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рд╕рднреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рд╢рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдкрд╛рдж рд╣реИ:


 @typeclass trait AdditiveSemigroupal[F[_]] { def sum[A, B](fa: F[A], fb: F[B]): F[Either[A, B]] } 

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ - рдХреНрдпрд╛ рд╣рдо Monoidal рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╕рдо рдПрдгреНтАНрдб рдкреНрд░реЛрдбрдХреНтАНрдЯ рдХреЗ рд▓рд┐рдП Nothing рдПрдВрдб Unit рд╣реЛрдЧрд╛:


 @typeclass trait AdditiveMonoidal[F[_]] extends AdditiveSemigroupal[F] { def nothing: F[Nothing] } @typeclass trait MultiplicativeMonoidal[F[_]] extends MultiplicativeSemigroupal[F] { def unit: F[Unit] } 

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


рд╕рдВрднрд╡рддрдГ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреА рддрд░рд╣ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, sum рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ AdditiveSemigroupal рд╕рдорд╛рди рдХреБрдЫ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдирд┐рдЪрд▓реЗ рдХреНрд░рдо рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕реЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ AdditiveSemigroupal рдЬреЛрдбрд╝реЗрдВред


рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд░рд╛рд╢рд┐ рд╣реИ, рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ + рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдСрдкрд░реЗрд╢рди рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ [+] рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдорд╛рдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп <+> рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


 def <+>[A, B](fa: F[A], fb: F[B]): F[Either[A, B]] 

<+> рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА combineK рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЬреЛ SemigroupK рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдореЗрдВ рдпрд╣ рджреЛ F[A] рд▓реЗрддрд╛ рд╣реИ рдФрд░ F[A] рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рдирд╣реАрдВ рдЬреИрд╕рд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИред


рдпрд╛ рд╕рдорд╛рди? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рджреЛ рдХрд╛рд░реНрдп рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 def sum[A, B](fa: F[A], fb: F[B]): F[Either[A, B]] def combineK[A](x: F[A], y: F[A]): F[A] = { val feaa: F[Either[A, A]] = sum(x, y) feaa.map(_.merge) } 

рдЪреВрдВрдХрд┐ AdditiveSemigroupal SemigroupK рдмрд░рд╛рдмрд░ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ AdditiveMonoidal MonoidK AdditiveMonoidal рд╕рдорд╛рди рд╣реЛ? рд╣рд╛рдВ, рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред MonoidK empty рд╕рдорд╛рд░реЛрд╣ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рд╣реИ:


 def empty[A]: F[A] 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди A рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рдХрд┐рд╕реА рднреА A рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ A рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ AdditiveMonoidal рдореЗрдВ F[Nothing] рдмрд░рд╛рдмрд░ рд╣реИред


рдЦреИрд░, рд╣рдордиреЗ рдПрдбрд┐рдЯрд┐рд╡ рдХреНрд▓рд╛рд╕реЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдирд╛рд▓реЙрдЧреНрд╕ рдкрд╛рдП рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ MultiplicativeSemigroupal cats.Semigroupal рдмрд░рд╛рдмрд░ рд╣реИред cats.Semigroupal ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рд░рд╣рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ MultiplicativeMonoidal рдХреЗ рд╕рдордХрдХреНрд╖ рдЦреЛрдЬрдирд╛ред


рдореИрдВ рдереЛрдбрд╝рд╛ рдзреЛрдЦрд╛ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдордХрдХреНрд╖ рд▓рд╛рдЧреВ рд╣реИред рдпрд╣ рдПрдХ pure рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ A рд▓реЗрддрд╛ рд╣реИ рдФрд░ F[A] ред MultiplicativeMonoidal рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ unit рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ F[Unit] ред рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдПрдВ? рдЬрд╡рд╛рдм рдлрд┐рд░ рд╕реЗ рдПрдХ рдлрдлреВрдВрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ:


 def unit: F[Unit] def pure(a: A): F[A] = unit.map(_ => a) 

рдЖрд╡реЗрджрдХ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рднреА рдЕрд╡рд╛рдпрд╡реАрдп рдФрд░ рдХрдВрдЯреНрд░рд╛рд╡реЗрд░реЗрдВрдЯ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдкреНрдЯреАрдЯреНрдпреВрдЯ рдореЗрдВ product рдФрд░ map рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ <*> рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдПрдХ рдФрд░ рд╕реБрд░рд╛рдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЧреБрдгрдХ рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд╣рдореЗрдВ рдЕрд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред


рдЕрдм рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ <+> рдФрд░ <*> , рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреА рд╣реИ, Semiring рдХреИрд╕реЗ + рдФрд░ * рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ? рд╣рд╛рдВ, рдФрд░ рдЗрд╕реЗ Alternative рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ MonoidK рдФрд░ MonoidK рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рд╕реБрд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ Semiringal :


 @typeclass trait Semiringal[F[_]] extends MultiplicativeMonoidal[F] with AdditiveMonoidal[F] 

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


рдпрджрд┐ рдпрд╣ рдЙрдкрд▓рдмреНрдз рдереЗ, рддреЛ рд╣рдо рдХрд┐рд╕реА рднреА Alternative рд▓рд┐рдП Semiring рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ Alternative рдЬреИрд╕реЗ рдХрд┐ Monoid рдФрд░ MonoidK рд▓рд┐рдП MonoidK ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо Semiring рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Semiring рдХреЛ Alternative рдореЗрдВ рд╡рд╛рдкрд╕ Semiring рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ Monoid рдХреЛ Monoid рдореЗрдВ рдмрджрд▓ Monoid рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 import Semiring.ops._ case class Const[A, B](getConst: A) implicit def constSemiringal[A: Semiring] = new Semiringal[Const[A, ?]] { def sum[B, C](fa: Const[A, B], fb: Const[A, C]): Const[A, Either[B, C]] = Const(fa.getConst + fb.getConst) def product[B, C](fa: Const[A, B], fb: Const[A, C]): Const[A, (B, C)] = Const(fa.getConst * fb.getConst) def unit: Const[A, Unit] = Const(Semiring[A].one) def nothing: Const[A, Nothing] = Const(Semiring[A].zero) } 

рдирд┐рд╖реНрдХрд░реНрд╖


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


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛


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


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рд╡рд░реНрдЧреЛрдВ рдХреА рдХрд╛рд░реНрдбрд┐рдирд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдереА, рд▓реЗрдХрд┐рди рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк A => B , Option[A] , Ior[A, B] рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП Cardinality рдкрд░рд┐рднрд╛рд╖рд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:


  1.  Cardinality.of[A => B] === Cardinality.of[B].pow(Cardinality.of[A]) 

  2.  Cardinality.of[Option[A]] === Cardinality.of[A] + 1 

  3.  Cardinality.of[Ior[A, B]] === Cardinality.of[A] + Cardinality.of[B] + Cardinality.of[A] * Cardinality.of[B] 

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


All Articles