рдЯрд╛рдЗрдк рдлреИрдорд┐рд▓реАрдЬ рдПрдВрдб рдкреЛрдХреЗрдореЙрди

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


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



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

рд╣рдо рдкреЛрдХреЗрдореЙрди рджреБрдирд┐рдпрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рд╕реАрдорд┐рдд (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд░рд▓реАрдХреГрдд, рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЛ рдореБрдЭреЗ рдорд╛рдл рдХрд░рдиреЗ рджреЗрдВ) рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН:

рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕


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

data Fire = Charmander | Charmeleon | Charizard deriving Show data Water = Squirtle | Wartortle | Blastoise deriving Show data Grass = Bulbasaur | Ivysaur | Venusaur deriving Show data FireMove = Ember | FlameThrower | FireBlast deriving Show data WaterMove = Bubble | WaterGun deriving Show data GrassMove = VineWhip deriving Show pickFireMove :: Fire -> FireMove pickFireMove Charmander = Ember pickFireMove Charmeleon = FlameThrower pickFireMove Charizard = FireBlast pickWaterMove :: Water -> WaterMove pickWaterMove Squirtle = Bubble pickWaterMove _ = WaterGun pickGrassMove :: Grass -> GrassMove pickGrassMove _ = VineWhip 

рдЕрдм рддрдХ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкреЛрдХреЗрдореЙрди рдЕрдкрдиреЗ рддрддреНрд╡ рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд 9 рдкреЛрдХреЗрдореЛрди рдореЗрдВ рд╕реЗ 6 рд╕рднреА рддреАрди рддрддреНрд╡реЛрдВ рдХреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП 2

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

 printBattle :: String -> String -> String -> String -> String -> IO () printBattle pokemonOne moveOne pokemonTwo moveTwo winner = do putStrLn $ pokemonOne ++ " used " ++ moveOne putStrLn $ pokemonTwo ++ " used " ++ moveTwo putStrLn $ "Winner is: " ++ winner ++ "\n" 

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

 battleWaterVsFire :: Water -> Fire -> IO () battleWaterVsFire water fire = do printBattle (show water) moveOne (show fire) moveTwo (show water) where moveOne = show $ pickWaterMove water moveTwo = show $ pickFireMove fire battleFireVsWater = flip battleWaterVsFire --   ,   ,   ,    

рдпрджрд┐ рд╣рдо рдпрд╣ рд╕рдм рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЭрдЧрдбрд╝реЗ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд┐рд▓реЗрдЧрд╛ред

рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕реЗрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп


рдХрд┐рддрдирд╛ рджреЛрд╣рд░рд╛рдпрд╛ рдХреЛрдб рд╣реИ: рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ рдкреЛрдХреЗрдореЛрди рдЗрд▓реЗрдХреНрдЯреНрд░рд┐рдХ рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд┐рдХрд╛рдЪреБ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ battleElectricVs(Grass|Fire|Water) рдЬреЛрдбрд╝рдирд╛ battleElectricVs(Grass|Fire|Water) рдЭрдЧрдбрд╝реЗред рдРрд╕реЗ рдХрдИ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдФрдкрдЪрд╛рд░рд┐рдХ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреЛрдХреЗрдореЙрди рдХреНрдпрд╛ рд╣реИ рдФрд░ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:

рд╣рдо рдФрдкрдЪрд╛рд░рд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╢рд╛рд╕рди рдХрд░реЗрдВрдЧреЗ, рддреЛ рд╣рдо рдЕрдм рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рдпреЛрдЬрдирд╛ рдХрд╛ рднреА рдирд╛рдо рдмрджрд▓ рджреЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд╣ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд╣ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдирд┐ рд╡рд░реНрдЧ

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

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

 class (Show pokemon, Show move) => Pokemon pokemon move where pickMove :: pokemon -> move instance Pokemon Fire FireMove where pickMove Charmander = Ember pickMove Charmeleon = FlameThrower pickMove Charizard = FireBlast instance Pokemon Water WaterMove where pickMove Squirtle = Bubble pickMove _ = WaterGun instance Pokemon Grass GrassMove where pickMove _ = VineWhip 

рдФрд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 pickMove Charmander :: FireMove 

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреЛрдХреЗрдореЛрди рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдШреВрдВрд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рд╣рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рджреЛ рдкреЛрдХреЗрдореЛрди рдХреА рд▓рдбрд╝рд╛рдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛, рддрд╛рдХрд┐ рд▓рдбрд╝рд╛рдИ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП battle*family*Vs*family рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рд╕рдХреЗред
рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:

 class (Pokemon pokemon move, Pokemon foe foeMove) => Battle pokemon move foe foeMove where battle :: pokemon -> foe -> IO () battle pokemon foe = do printBattle (show pokemon) (show move) (show foe) (show foeMove) (show pokemon) where move = pickMove pokemon foeMove = pickMove foe instance Battle Water WaterMove Fire FireMove 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреНрд░реЛрдХ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХреЛрдИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрддрд┐рдо рдХреЛрдб рдмрджрд╕реВрд░рдд рджрд┐рдЦрддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдбрд╝рд╛рдИ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
 battle :: pokemon -> foe -> IO (move, foeMove) 

рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп, рдЕрдВрдд рдореЗрдВ!


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

рдЯрд╛рдЗрдк TypeFamilies рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ TypeFamilies рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ TypeFamilies ред рдЬреИрд╕реЗ рд╣реА рд╣рдо рдкреНрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 {-# LANGUAGE TypeFamilies, FlexibleContexts #-} class (Show p, Show (Move p)) => Pokemon p where data Move p :: * pickMove :: p -> Move p 

рд╣рдордиреЗ рдЕрдкрдиреЗ рдкреЛрдХреЗрдореЙрди рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рддрд░реНрдХ рдФрд░ рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдВрджреЛрд▓рди рд╣реИред рдЖрдВрджреЛрд▓рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ "рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп" рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░реЛрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо WaterMove рдмрдЬрд╛рдп Move Fire рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, WaterMove рд╕реНрдерд╛рди рдкрд░ Move Water , рдЖрджрд┐
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рд▓рдЧрднрдЧ рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд╣реА рджрд┐рдЦрддреА рд╣реИ, рдХреЗрд╡рд▓ Show move рдмрдЬрд╛рдп рд╣рдо Show (Move a)) рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЬреЛрдбрд╝ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: FlexibleContexts ред
рдЕрдм рд╣рд╛рд╕реНрдХреЗрд▓ рд╣рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рджрд╛рдИрдВ рдУрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдмрджреНрдз рдбреЗрдЯрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЯрд╛рдЗрдк рдкрд░рд┐рд╡рд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред

 data Fire = Charmander | Charmeleon | Charizard deriving Show instance Pokemon Fire where data Move Fire = Ember | FlameThrower | FireBlast deriving Show pickMove Charmander = Ember pickMove Charmeleon = FlameThrower pickMove Charizard = FireBlast data Water = Squirtle | Wartortle | Blastoise deriving Show instance Pokemon Water where data Move Water = Bubble | WaterGun deriving Show pickMove Squirtle = Bubble pickMove _ = WaterGun data Grass = Bulbasaur | Ivysaur | Venusaur deriving Show instance Pokemon Grass where data Move Grass = VineWhip deriving Show pickMove _ = VineWhip 

рдЕрдм рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
 pickMove Squirtle 

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

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

 class (Pokemon pokemon, Pokemon foe) => Battle pokemon foe where battle :: pokemon -> foe -> IO () battle pokemon foe = do printBattle (show pokemon) (show move) (show foe) (show foeMove) (show pokemon) where foeMove = pickMove foe move = pickMove pokemon 

рдФрд░, рддреБрдо, рдЕрдм рд▓рдбрд╝рд╛рдИ рдЕрдм рд╣рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдФрд░ рдкреЛрдХреЗрдореЛрди рдХреЛ рдкреАрдЯрддреЗ рд╣реБрдП рд▓рдЧрднрдЧ рднреЛрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

 instance Battle Water Fire instance Battle Fire Water where battle = flip battle instance Battle Grass Water instance Battle Water Grass where battle = flip battle instance Battle Fire Grass instance Battle Grass Fire where battle = flip battle 

рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рд░рд▓ рд╣реИ:
  battle Squirtle Charmander 

рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЕрдВрдд рдореЗрдВ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдирдЬрд╝рд░ рдорд┐рд▓рд╛, рд╣рдордиреЗ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛, рдФрд░ рдЯрд╛рдЗрдк рдЪреЗрдХрд░ рдЕрдзрд┐рдХ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдХрдо рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдПрдкреАрдЖрдИ рд╣реИред

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

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдкреЛрдХреЗрдореЙрди рд╡рд░реНрд▓реНрдб рдореЗрдВ рдПрдХ рдФрд░ рдЪреАрдЬ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдЕрдм рд╣рдордиреЗ рдЕрдкрдиреЗ Water рдФрд░ Fire рддрддреНрд╡реЛрдВ рдХреЛ Battle Water Fire рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ Battle Water Fire рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рд╣реИред рдкрд╣рд▓рд╛ Pokemon рд╣рдореЗрд╢рд╛ рдЬреАрддрддрд╛ рд╣реИ, рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рдореЗрд╢рд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИ:
 -- Winner Pokemon move -- Loser Pokemon move -- Winner pokemon Wins. 

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╣рд╛рд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ, рддрдм рднреА рд╡рд┐рдЬреЗрддрд╛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рдЗрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдирдореВрдиреЛрдВ рдХреЛ рддрдп рдХрд░рдиреЗ рджреЗрдВ рдХрд┐ рд▓рдбрд╝рд╛рдИ рдХреМрди рдЬреАрддрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 -- Loser Pokemon move -- Winner Pokemon move -- Winner pokemon Wins 

рдПрд╕реЛрд╕рд┐рдПрдЯреЗрдб рдЯрд╛рдЗрдк рд╕рдорд╛рдирд╛рд░реНрдереА


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

 class Battle pokemon foe where .. winner :: pokemon -> foe -> ??? --   , 'pokemon'  'foe'? instance Battle Water Fire where winner :: Water -> Fire -> Water -- Water    : pokemon winner water _ = water instance Battle Fire Water where winner :: Fire -> Water -> Water -- Water   : foe winner _ water = water 

рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, Battle Water Fire рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЬреЗрддрд╛ рдкреНрд░рдХрд╛рд░ pokemon рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ Battle Fire Water рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА foe ред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЯрд╛рдЗрдк рдкрд░рд┐рд╡рд╛рд░ рднреА рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рдирд╛рд░реНрдердХ рд╢рдмреНрдж рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдмреИрдЯрд▓ рдХреНрд▓рд╛рд╕ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ Winner pokemon foo , рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ рдХрд╛ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ pokemon рдпрд╛ foe рд▓рд┐рдП рдПрдХ рдкрд░реНрдпрд╛рдп рд╣реИред
Winner рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ * -> * -> * , рдЬреЛ pokemon рдФрд░ foo рджреЛрдиреЛрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рд╣рдо рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ pokemon рдЪрдпрди рдХрд░реЗрдЧрд╛

 class (Show (Winner pokemon foe), Pokemon pokemon, Pokemon foe) => Battle pokemon foe where type Winner pokemon foe :: * --    type Winner pokemon foe = pokemon --      battle :: pokemon -> foe -> IO () battle pokemon foe = do printBattle (show pokemon) (show move) (show foe) (show foeMove) (show winner) where foeMove = pickMove foe move = pickMove pokemon winner = pickWinner pokemon foe pickWinner :: pokemon -> foe -> (Winner pokemon foe) 

рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ:

 instance Battle Water Fire where pickWinner pokemon foe = pokemon instance Battle Fire Water where type Winner Fire Water = Water pickWinner = flip pickWinner 

рдЕрдм рдмрд╕ рдЗрддрдирд╛ рд╣реАред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдкреЛрдХреЗрдореЙрди рдХреА рд▓рдбрд╝рд╛рдИ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг
 {-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleContexts #-} class (Show pokemon, Show (Move pokemon)) => Pokemon pokemon where data Move pokemon :: * pickMove :: pokemon -> Move pokemon data Fire = Charmander | Charmeleon | Charizard deriving Show instance Pokemon Fire where data Move Fire = Ember | FlameThrower | FireBlast deriving Show pickMove Charmander = Ember pickMove Charmeleon = FlameThrower pickMove Charizard = FireBlast data Water = Squirtle | Wartortle | Blastoise deriving Show instance Pokemon Water where data Move Water = Bubble | WaterGun deriving Show pickMove Squirtle = Bubble pickMove _ = WaterGun data Grass = Bulbasaur | Ivysaur | Venusaur deriving Show instance Pokemon Grass where data Move Grass = VineWhip deriving Show pickMove _ = VineWhip printBattle :: String -> String -> String -> String -> String -> IO () printBattle pokemonOne moveOne pokemonTwo moveTwo winner = do putStrLn $ pokemonOne ++ " used " ++ moveOne putStrLn $ pokemonTwo ++ " used " ++ moveTwo putStrLn $ "Winner is: " ++ winner ++ "\n" class (Show (Winner pokemon foe), Pokemon pokemon, Pokemon foe) => Battle pokemon foe where type Winner pokemon foe :: * type Winner pokemon foe = pokemon battle :: pokemon -> foe -> IO () battle pokemon foe = do printBattle (show pokemon) (show move) (show foe) (show foeMove) (show winner) where foeMove = pickMove foe move = pickMove pokemon winner = pickWinner pokemon foe pickWinner :: pokemon -> foe -> (Winner pokemon foe) instance Battle Water Fire where pickWinner pokemon foe = pokemon instance Battle Fire Water where type Winner Fire Water = Water pickWinner = flip pickWinner instance Battle Grass Water where pickWinner pokemon foe = pokemon instance Battle Water Grass where type Winner Water Grass = Grass pickWinner = flip pickWinner instance Battle Fire Grass where pickWinner pokemon foe = pokemon instance Battle Grass Fire where type Winner Grass Fire = Fire pickWinner = flip pickWinner main :: IO () main = do battle Squirtle Charmander battle Charmeleon Wartortle battle Bulbasaur Blastoise battle Wartortle Ivysaur battle Charmeleon Ivysaur battle Venusaur Charizard 


рдЕрдм рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА Electric Pokemon рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ! рдЗрд╕реЗ рдЖрдЬрдорд╛рдЗрдП!

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

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


All Articles