рдПрдлрдкреА рдореЗрдВ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ред рднрд╛рдЧ рей

рдЧреБрдг рдФрд░ рдХрд╛рдиреВрдиред рдкрд░рд┐рджреГрд╢реНрдпред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрд▓рдЯрд╛ред



рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рд╕рд┐рджреНрдзрд╛рдВрдд


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



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



рдкреНрд░рдЧрддрд┐ op = рдкреБрдирд░рд╛рд╡реГрддрд┐ ( `op` 2 )



рдЬреНрдпрд╛рдорд┐рддреАрдп рд░реВрдкрд╛рдВрддрд░ , рдЕрдВрдХрдЧрдгрд┐рддреАрдпрдкреНрд░рдХреНрд░рдо :: рдкреВрд░реНрдгрд╛рдВрдХ -> [ рдкреВрд░реНрдгрд╛рдВрдХ ]

geometricProgression = рдкреНрд░рдЧрддрд┐ ( * )

рдЕрдВрдХрдЧрдгрд┐рддрдкреНрд░рдХреНрд░рд┐рдпрд╛ = рдкреНрд░рдЧрддрд┐ ( + )



рдЬреНрдпрд╛рдорд┐рддреАрдп , рдЕрдВрдХрдЧрдгрд┐рддреАрдп :: [ рдкреВрд░реНрдгрд╛рдВрдХ ]

geometricals = 10 $ geometricProgression 1 рд▓реЗрдВ

рдЕрдВрдХрдЧрдгрд┐рдд = 10 $ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрдВрдХ 1 рд▓реЗрдВ


рдпрд╣рд╛рдВ, рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди ((*), (+), `op` 2) рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдкреБрдирд░рд╛рд╡реГрддрд┐, рдкреНрд░рдЧрддрд┐) рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдХреБрдЫ рдХреЛрдб рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдФрд░ рдкреНрд░рд╛рдкреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдЬреНрдЮрд╛рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рддрд░реНрдХ Integer -> Integer рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдХрд░рдг рдХрд┐рддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд┐рдпрдВрддреНрд░рдг рдЙрд▓рдЯрд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ; рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдп рдЖрдкрдХреЛ рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдПрдХ рдмрдбрд╝реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ: IoC рдХреА рдпрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдмрд╣реБрдд рднреЛрд▓реА рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рднреЛрд▓реА рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдПрдХ рдЕрдЦрдВрдб рдкрд┐рд░рд╛рдорд┐рдб рд╣реИ, рдФрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдпрд╣ рд╡рд┐рд╢рд╛рд▓ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдмрдврд╝реЗрдЧрд╛ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдорд░реНрдерд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред



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



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



рдмрд╣реБрдд рдЕрднреНрдпрд╛рд╕


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



рдЧреБрдг рдФрд░ рд╡рд╕реНрддреБ



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





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



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдореМрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЦреЗрд▓ рдХреЗ рдирдХреНрд╢реЗ рдкрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:



рдХреЛрд░:

рдирд╛рдо = "рдХреЗрд░реЛрди"

рд╕реНрдерд╛рди = ( 1 , 1 , 1 )

рдкрд░рдд = рдкреГрдереНрд╡реА

рд╕реНрд╡рд╛рдореА = рдЦрд┐рд▓рд╛рдбрд╝реА рез

рд╢рдХреНрддрд┐ = 100/100

рдмреИрдЯрд░реА = 300/2000

рдХрд╛рд░рдЦрд╛рдирд╛ = рдкреНрд▓рд╛рдЬрд╝реНрдорд╛ , рдЦрд┐рд▓рд╛рдбрд╝реА рез



рдкреНрд▓рд╛рдЬреНрдорд╛:

рдирд╛рдо = "рдкреНрд▓рд╛рдЬреНрдорд╛"

рд╕реНрдерд╛рди = ( 2 , 1 , 1 )

рдкрд░рдд = рдкреГрдереНрд╡реА

рд╕реНрд╡рд╛рдореА = рдЦрд┐рд▓рд╛рдбрд╝реА рез

рддрд╛рдХрдд = 30/40


рдЪреВрдВрдХрд┐ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рдмреАрдЬрдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░ ( рдХреЛрдб ) рдХреЗ рддрд╣рдд рд░рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:



- Object.hs:

рдбреЗрдЯрд╛ рдкреНрд░реЙрдкрд░реНрдЯреА = рдирд╛рдорд╛рдВрдХрд┐рдд рдирд╛рдо

| рдЙрдкрдпреБрдХреНрддрддрд╛ ( рд╕рдВрд╕рд╛рдзрди рд╕реНрдерд╛рдпрд┐рддреНрд╡ )

| PBattery ( рд╕рдВрд╕рд╛рдзрди рдКрд░реНрдЬрд╛ )

| POwNERhip рдкреНрд▓реЗрдпрд░

| рд▓реЗрдпрд░ рдЦреЗрд▓рддреЗ рд╣реИрдВ

...

рд╡реНрдпреБрддреНрдкрдиреНрди ( рджрд┐рдЦрд╛рдПрдБ , рдкрдврд╝реЗрдВ , рдЗрдХ )


рд╕рд╛рд░ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:



- Object.hs:

рдкреНрд░рдХрд╛рд░ PropertyKey = Int

рдкреНрд░реЙрдкрд░реНрдЯреА рдореИрдк = M рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдореИрдк рдкреНрд░реЙрдкрд░реНрдЯреАрдХреЗ рдкреНрд░реЙрдкрд░реНрдЯреА



рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ = рдСрдмреНрдЬреЗрдХреНрдЯ { propertyMap :: PropertyMap }

рд╡реНрдпреБрддреНрдкрдиреНрди ( рджрд┐рдЦрд╛рдПрдБ , рдкрдврд╝реЗрдВ , рдЗрдХ )


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



рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЧреБрдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рднрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Data.Map рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ :



- рдЙрджреНрджреЗрд╢реНрдп:

рдЖрдпрд╛рдд рд╡рд╕реНрддреБ



рдХрд░рд┐рдпрди = рд╡рд╕реНрддреБ $ рдПрдоред fromList [ ( 1 , PObjectId 1 )

, ( 4 , "рдирд╛рдо" "Karyon" )

, ( 2 , рдЙрдкрдпреБрдХреНрддрддрд╛ ( рд╕рдВрд╕рд╛рдзрди 100 100 )

, ( 3 , PBattery ( рд╕рдВрд╕рд╛рдзрди 300 2000 ) )

, ( 10 , рдкреЛрд░реНрд╡рд╢рд┐рдкрд╢рд┐рдк рдкреНрд▓реЗрдпрд░ 1 )

, ( 5 , рд╡рд┐рдзрд╛рдпрд┐рдХрд╛ ( рдмрд┐рдВрджреБ 1 1 1 ) )

, ... ]


... рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП! рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ рд╕реЗ рд╣рдо PObjectId, Dislocation рдФрд░ Ownership рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ? рд╕рдм рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ! рджреВрд╕рд░реА рдУрд░, рдРрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдг рд╣реИрдВ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдмрджрд▓рддреЗ рдирд╣реАрдВ рд╣реИрдВ: PNamed рдФрд░ PLayer, PFabric рдФрд░ PPassRestriction (рдЖрдВрджреЛрд▓рди рдирд┐рд╖реЗрдз)ред Karyon рдореЗрдВ, рдкрд░рдд рдХреЗрд╡рд▓ рдЧреНрд░рд╛рдЙрдВрдб рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ PNamed "рдкреНрд▓рд╛рдЬреНрдорд╛" рдЧреБрдг рдХреНрд░рдорд╢рдГ рдкреНрд▓рд╛рдЬреНрдорд╛ рддрдХ рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реАрдзреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕реА рд╕рдордп рдЖрдкрдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рддрдерд╛рдХрдерд┐рдд " рд╕реНрдорд╛рд░реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ " рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ - рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкреИрдЯрд░реНрди рдФрд░ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛрд╢рд┐рдпрд╛рд░ karyon рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:



- рдЙрджреНрджреЗрд╢реНрдп:

рдЖрдпрд╛рдд рд╡рд╕реНрддреБ



karyon pId рдкреНрд▓реЗрдпрд░ рдкреЙрдЗрдВрдЯ = рдСрдмреНрдЬреЗрдХреНрдЯ $ M fromList [ ( 1 , PObjectId pId )

, ( 4 , "рдирд╛рдо" "Karyon" )

, ( 2 , рдЙрдкрдпреБрдХреНрддрддрд╛ ( рд╕рдВрд╕рд╛рдзрди 100 100 )

, ( 3 , PBattery ( рд╕рдВрд╕рд╛рдзрди 300 2000 ) )

, ( 10 , рдкреЛрд╡реЗрд░рд╢рд┐рдк рдкреНрд▓реЗрдпрд░ )

, ( 5 , рд╡рд┐рдзрд╛рди рд╕рднрд╛ рдмрд┐рдВрджреБ )

, ... ]


рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╢рд╛рдпрдж рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╣реБрдд рдЕрдзрд┐рдХ "рд╢реЛрд░" рдФрд░ рд╢рд░реАрд░ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рднрд╛рд╖рд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рд╕рд░рд▓рддрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрддрд┐рд╕реВрдХреНрд╖реНрдорд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдХреЛрдб рдЕрдзрд┐рдХ рд╕реБрдВрджрд░, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдЖрд╣, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреБрдЫ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдореМрдЦрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдЕрд╕рдВрднрд╡ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ!



- рд╡рд╕реНрддреБрдПрдВ

рдкреНрд▓рд╛рдЬреНрдорд╛рдлреИрдВрдЧ :: рдЦрд┐рд▓рд╛рдбрд╝реА -> рдмрд┐рдВрджреБ -> рдХрдкрдбрд╝рд╛

рдкреНрд▓рд╛рдЬреНрдорд╛рдлреНрд▓рд┐рдк pl p = makeObject $ do

рдПрдирд░реНрдЬреАрдХреЙрд╕реНрдЯ ред = 1

рдпреЛрдЬрдирд╛ ред = рдкреНрд▓рд╛рдЬреНрдорд╛ рдкреАрдПрд▓

рдирд┐рд░реНрдорд╛рдг ред = рд╕рддреНрдп

рдкреНрд▓реЗрд╕рдореЗрдВрдЯрдЕрд▓реНрдЧ ред = placeToNearestEmptyCell



karyon :: рдЦрд┐рд▓рд╛рдбрд╝реА -> рдмрд┐рдВрджреБ -> рд╡рд╕реНрддреБ

karyon pl p = makeObject $ do

nameA | = karyonName

рдкрд░рдд | = рдЬрдореАрди

рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ | = рдкреА

рдмреИрдЯрд░реАрдП | = ( 300 , рдЬрд╕реНрдЯ 2000 )

рдЯрд┐рдХрд╛рдКрдкрди | = ( 100 , рдЬрд╕реНрдЯ 100 )

рдорд╛рд▓рд┐рдХрд╛рдирд╛ | = pl

рдлреИрдмреНрд░рд┐рдХ | = рдкреНрд▓рд╛рдЬрд╝реНрдорд╛рдлрд╛рдпрд░ рдкреНрд▓реЗрди рдкреА


рдХреЛрдб рдХреА рд╕рдордЭ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдкрд╛рдардХ рдХрд╛ рдЬреНрдЮрд╛рди рдФрд░ рд╕реЛрдЪ рд▓реЗрдЦрдХ рдХреЗ рдЬреНрдЮрд╛рди рдФрд░ рд╕реЛрдЪ рдХреЗ рд╕рд╛рде рдХрд┐рддрдирд╛ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИ? рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрдЯрд░ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ "=ред" рдФрд░ "= =" рдпрд╣рд╛рдБ рдорддрд▓рдм рд╣реИ? MakeObject рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдХреБрдЫ рдирд╛рдореЛрдВ рдореЗрдВ рдЕрдХреНрд╖рд░ "A" рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ? рдФрд░ рд╡рд╣ рд╕рдиреНрдпрд╛рд╕реА рд╣реИ рдпрд╛ рдХреБрдЫ рдФрд░?



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



- Object.hs:

makeObject :: рдбрд┐рдлрд╝реЙрд▓реНрдЯ a => рд░рд╛рдЬреНрдп a ( ) -> a

makeObject = рдлреНрд▓рд┐рдк рдПрдЧреНрдЬреЙрд╕реНрдЯ рдбрд┐рдл



data PAccessor a = PAccessor { рдХреБрдВрдЬреА :: PropertyKey

, constr :: a -> рд╕рдВрдкрддреНрддрд┐ }



- рдСрдкрд░реЗрдЯрд░ рднрд░рдиреЗ рдХреЗ рдЧреБрдг:

( - = ) рдПрдХреНрд╕реЗрд╕рд░ v = рдХрд░рддреЗ рд╣реИрдВ

рд╕рд╣рд╛рд░рд╛ <- рдорд┐рд▓рддрд╛ рд╣реИ

let oldPropMap = _ propertyMap рдкреНрд░реЙрдкреНрд╕

let newPropMap = insertProperty ( рдХреБрдВрдЬреА рдПрдХреНрд╕реЗрд╕рд░ ) ( constr accessor v ) рдкреБрд░рд╛рдиреЗрдкреНрд░реЛрдкрдкрд╛рд░реНрдЯ

$ рд╕рд╣рд╛рд░рд╛ рд▓рдЧрд╛рдУ { _ propertyMap = newPropMap }



- рдирд╛рдорд╛рдВрдХрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕рд░:

isNamedValid ( рдирд╛рдорд╛рдВрдХрд┐рдд n ) = рдирд╣реАрдВ ред null $ n

nameValidator рдПрди | isNamedValid n = n

| рдЕрдиреНрдпрдерд╛ = рддреНрд░реБрдЯрд┐ $ "рдЕрд╡реИрдз рдирд╛рдорд┐рдд рд╕рдВрдкрддреНрддрд┐:" ++ рд╢реЛ рдПрди



nameA = PAccessor 0 $ PNamed ред namedValidator


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



рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рдорд╛рд░рд╛ рдЕрдВрддрд┐рдо рдкреНрд░рд╢реНрди рд╣реИ: рд╡рд┐рд╢реНрд╡ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдм рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ? рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдереЗ, рджреБрдирд┐рдпрд╛ рдЕрднреА рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИ:



рдЯрд╛рдЗрдк рд╡рд░реНрд▓реНрдб = рдПрдоред рдорд╛рдирдЪрд┐рддреНрд░ рдмрд┐рдВрджреБ рд╡рд╕реНрддреБ


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



рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ



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



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



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



рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:



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



- рдкрд░рд┐рджреГрд╢реНрдпред

createProduct :: рдПрдирд░реНрдЬреА -> рдСрдмреНрдЬреЗрдХреНрдЯ -> рдПрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ

createProduct eCost sch = рдХрд░рддреЗ рд╣реИрдВ

pl <- рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдкрдврд╝реЗрдВ

рдбреА <- рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рдкрдврд╝реЗрдВ

рдкреНрд░рддреНрдпрд╛рд╣рд╛рд░ pl eCost

рд╡рд╛рдкрд╕реА $ рд╕рдорд╛рдпреЛрдЬрд┐рдд sch [ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ ред ~ pl , рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ ред ~ d ]



placeProduct рдареЗрд╕ plAlg = do

l <- withDefault ground $ getProperty рдкрд░рдд рдареЗрд╕

obj <- getActedObject

рдкреА <- рдореВрд▓реНрдпрд╛рдВрдХрдирдкреНрд▓рд╕рдореЗрдВрдЯрдПрдПрд▓рдЬреА рдкреНрд▓реИрдЧ рдПрд▓ рдПрд▓рдЬреЗ

$ рд╡рд╕реНрддреБ рдХреЛ рдмрдЪрд╛рдПрдВ



рдЪ = рдХрд░рдирд╛

prodObj <- createProduct ( f ^ред EnergyCost ) ( f ^ред рд╕реНрдХреАрдо )

рд╕реНрдерд╛рдирдЙрддреНрдкрд╛рдж prodObj ( f ^ред рдкреНрд▓реЗрд╕рдореЗрдВрдЯрдЕрд▓реНрдЧ )

рд╡рд╛рдкрд╕реА "рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд░реНрдорд┐рддред"



рдкреНрд░реЛрдбреНрдпреВрд╕рд╕реЗрдирд╛рд░рд┐рдпреЛ :: рдПрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ

рдЙрддреНрдкрд╛рджрдХрд╕реЗрдирд╛рд░рд┐рдпреЛ = рдХрд░рддреЗ рд╣реИрдВ

f <- рдлреИрдмреНрд░рд┐рдХ рдкрдврд╝реЗрдВ

рдЕрдЧрд░ рдПрдл ^ред рдЙрддреНрдкрд╛рджрди

рдлрд┐рд░ рдЙрддреНрдкрд╛рджрди рдЪ

рдФрд░ рд╡рд╛рдкрд╕реА "рдирд┐рд░реНрдорд╛рдг рд░реЛрдХрд╛ рдЧрдпрд╛ред"


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



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



- рдореВрд▓реНрдпрд╛рдВрдХрдиред

EvalType ctx res = EitherT EvalError ( State ctx ) res рдЯрд╛рдЗрдк рдХрд░реЗрдВ

Eval Res = EvalType EvalationContext Res рдЯрд╛рдЗрдк рдХрд░реЗрдВ


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



data DataContext = DataContext { dataObjects :: Eval Objects

, dataOjectGraph :: Eval ( рдиреЗрдмрд░рд╣реБрдбреНрд╕рдлрдВрдХ -> рдСрдмреНрдЬреЗрдХреНрдЯрдЧреНрд░рд╛рдл )

, dataOjectAt :: Point -> Eval ( рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╕реНрддреБ ) }



data EvaluationContext = EvaluationContext { ctxData :: DataContext

, ctxTransactionMap :: TransactionMap

, ctxActedObject :: рд╢рд╛рдпрдж рд╡рд╕реНрддреБ

, ctxNextRndNum :: Eval Int }


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



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



- рдореВрд▓реНрдпрд╛рдВрдХрдиред

рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ = evalState ( runEitherT рдкрд░рд┐рджреГрд╢реНрдп )

рдкрд░рд┐рджреГрд╢реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ = рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ( runEitherT рдкрд░рд┐рджреГрд╢реНрдп )

рд░рди рдкрд░рд┐рджреГрд╢реНрдп = runState ( runEitherT рдкрд░рд┐рджреГрд╢реНрдп )


рдЦреЗрд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ - рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдореЗрдирд╕реЗрдирд╛рд░рд┐рдпреЛ рдлрд╝рдВрдХреНрд╢рди:



- рдкрд░рд┐рджреГрд╢реНрдпред

рдореЗрдирд╕реЗрдирд╛рд░рд┐рдпреЛ :: Eval ( )

рдореЗрдирд╕реЗрдирд╛рд░рд┐рдпреЛ = рдХрд░рддреЗ рд╣реИрдВ

forProperty рдХрдкрдбрд╝реЗ рдХрд╛ рдЙрддреНрдкрд╛рджрдирд╕реЗрдирд╛рд░рд┐рдпреЛ

forProperty рдореВрд╡рд┐рдВрдЧ рдореВрд╡рд┐рдВрдЧрд╕реЗрдХреЗрдирд╛рд░рд┐рдпреЛ

рд╡рд╛рдкрд╕реА ( )



- рдХрд╣реАрдВ рдореБрдЦреНрдп рдХреЛрдб рдореЗрдВ - рдкреВрд░реЗ рдЦреЗрд▓ рдХрд╛ рдПрдХ рдЯрд┐рдХ:

stepGame gameContext = runScenario mainScenario gameContext


рдЙрд╕реА рддрд░рд╣, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЗрдХрд╛рдИ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рджреГрд╢реНрдп рдбреА рдХреЛрдб рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛрдб, - рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдПрдХ рдкреВрд░реНрдг QuickCheck рдпрд╛ HUnit рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдореБрдЦреНрдп = рдХрд░рддреЗ рд╣реИрдВ

Let ctx = testContext $ initialGame 1

рдкрд░рд┐рдгрд╛рдо рджреЗрдирд╛ = рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ ( рдкреНрд▓реЗрд╕рдкреНрд░реЛрдбрдХреНрдЯ ( рдкреНрд▓рд╛рдЬрд╝реНрдорд╛ рдкреНрд▓реЗрдпрд░ 1 рдкреЙрдЗрдВрдЯ 1 ) рдирд┐рдХрдЯрддрдо рдЗрдореЗрд▓рд╕реАрд╕реЗрд▓ ) рд╕реАрдЯреАрдПрдХреНрд╕

рдкреНрд░рд┐рдВрдЯ рдкрд░рд┐рдгрд╛рдо


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



рдкреНрд░рддреНрдпрд╛рд╣рд╛рд░ pl pl cnt = do

obj <- SingleActual $ рдХрд╛ рдирд╛рдо `is` karyonName ~ & ~ рд╕реНрд╡рд╛рдорд┐рддреНрд╡` рд╣реИ` pl ~ & ~ рдмреИрдЯрд░реАрдЪрд╛рд░реНрдЬ `SuchThat` ( > = cnt )

batRes <- getProperty рдмреИрдЯрд░реА obj

$ рдмреИрдЯрд░реАрдЪрд╛рд░реНрдЬ рдмрдЪрд╛рдПрдВ ред ~ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ редResourceStock batRes $ obj


рдпрд╣ рднреА рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ: рдЦрд┐рд▓рд╛рдбрд╝реА рдкреАрдПрд▓ рдХреЗ рд▓рд┐рдП, рдХреЛрд░ рд╕реЗ рдКрд░реНрдЬрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЦреЛрдЬреЗрдВ: рдирд╛рдорд╛рдВрдХрд┐рдд == "Karyon" рдФрд░ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ == plред рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рд╣рдо рдПрдХ рдПрдХрд▓ рдХреЙрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ - рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзреЗрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╡рд╕реНрддреБ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореМрдЦрд┐рдХ рд╡рд┐рд╡рд░рдг рд▓рдЧрднрдЧ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



`` рдХрд╛ рдирд╛рдо рдХреНрд░рд┐рдпреЛрдирдирд╛рдо рд╣реИ

~ & ~ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ `pl рд╣реИ

~ & ~ рдмреИрдЯрд░реАрдЪрд╛рд░реНрдЬ `рдРрд╕реЗ рдереЙрдЯ` ( > = рд╕реЗрдВрдЯ )


рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдСрдкрд░реЗрдЯрд░ (~ & ~) рдХрд╛ рдЕрд░реНрде рд╣реИ "рдФрд░", рдФрд░ рдСрдкрд░реЗрдЯрд░ `рдПрдХ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреА рд╕рдорд╛рдирддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рддреАрд╕рд░реА рд╡рд┐рдзреЗрдп рд╕реНрдерд┐рддрд┐ рдХреЗрд╡рд▓ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреА рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдмреИрдЯрд░реА рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рдЕрдзрд┐рдХ рдКрд░реНрдЬрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЪрд╛рд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдКрд░реНрдЬрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╛ рддреЛ рдореЛрдирд╛рдб рдЕрд╕рдлрд▓-рд╢рд╛рдЦрд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдкреВрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рджреНрдж рдХрд░ рджреА рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдКрд░реНрдЬрд╛ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рдкрд╕ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ:



$ рдмреИрдЯрд░реАрдЪрд╛рд░реНрдЬ рдмрдЪрд╛рдПрдВ ред ~ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ редResourceStock batRes $ obj


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



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



Antipattern Lens + NoMonomorphismRestriction



рд╕рднреА рдмреАрдорд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдкреНрд░реЙрдкрд░реНрдЯреА рдореИрдк рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдВрд╕ рдореЗрдВ рд╣реИ:



рд╕рдВрдкрддреНрддрд┐ kl = propertyMap ред k рдкрд░ ред рдкрдЧрдбрдВрдбреА ред рдПрд▓



named = property ( key namedA ) _ named

durability = property ( key durabilityA ) _ durability

battery = property ( key batteryA ) _ battery

...


рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдВрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдЬреНрдо рдЪреЗрдХ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, NoMonomorphismRestriction рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╕рдмрд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реИрдХреНрд╢рди рдЯреВрдЯрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдкрдбрд╝реАред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░: NoMonomorphismRestriction рдореЛрдб рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдЪрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдЬрд╣рд╛рдВ Object.hs рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкрд╛рдЧрд▓рдкрди рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк-рдЪреЗрдХрд░ рдХреЛ рд╕рдВрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЕрдВрдд рдореЗрдВ, рдкрд░рд┐рджреГрд╢реНрдп рдбреАрдЖрдИрдУрдПрд╕ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдиреЗ рдЯрд╛рдпрдордлрд╛рдпрд░ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рддрд╣рдд рдЧреБрдлрд╛ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдХрдИ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реБрдПред



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



data Object = Object {

-- Properties:

objectId :: ObjectId -- static property

, objectType :: ObjectType -- predefined property



-- Runtime properties, resources:

, ownership :: Player -- runtime property... or can be effect!



, lifebound :: IntResource -- runtime property

, durability :: IntResource -- runtime property

, energy :: IntResource -- runtime property

}


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



рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


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



рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдЙрд▓рдЯрд╛


рдбрд┐рд╕реНрдХреНрд▓реЗрдорд░: рд▓реЗрдЦрдХ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдЦрдВрдб рдХреЗ рд▓рд┐рдП рд╢реЛрдз рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛ред рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред



рдореЛрдирд╛рдбрд┐рдХ рд░рд╛рдЬреНрдп рдЗрдВрдЬреЗрдХреНрд╢рди



рдХреНрдпрд╛ рд╣реИ : рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рдиред

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ : рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рдмрд╛рд╣рд░реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдЕрдореВрд░реНрдд рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдПред

рд╡рд┐рд╡рд░рдг : рдПрдХ рдмрд╛рд╣рд░реА рд░рд╛рдЬреНрдп рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдЯреЗрдЯ рдореЛрдирдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рд╕рдВрджрд░реНрдн рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдмрд╛рд╣рд░реА рд░рд╛рдЬреНрдп рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рд╕рдВрд░рдЪрдирд╛ :

рд╣рдо рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдЗрд╕рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рд╣рд░реА рд╕реНрдерд┐рддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА:



data Context = Context { ctxNextId :: State Context Int }


. :



constantId :: State Context Int

constantId = return 42


:



nextId :: Int -> State Context Int

nextId prevId = do let nId = prevId + 1

modify ( \ctx -> ctx { ctxNextId = nextId nId } )

return nId


State:



client = do

externalId <- get >>= ctxNextId

doStuff externalId

return externalId


, :



print $ evalState client ( Context constantId )

print $ evalState client ( Context ( nextId 0 ) )


: gist

- :

Sequental ids:

[ ( 1 , "GNVOERK" ) , ( 2 , "RIKTIG YOGLA" ) ]

Random ids:

[ ( 59 , "GNVOERK" ) , ( 64 , "RIKTIG YOGLA" ) ]


рдореЙрдбреНрдпреВрд▓ рдЕрдореВрд░реНрдд



рдпрд╣ рдХреНрдпрд╛ рд╣реИ : рдПрдХ рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ред

рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ : рдХреНрд░рдо рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

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

рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг : рдЬрд┐рд╕реНрдЯ



All Articles