рд╕реЗрд▓реБрд▓рд░ рдСрдЯреЛрдореЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдордирд╛рдб

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



life_anim



рдЬрдЧрдд



Universe



рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 data Universe a = Universe [a] a [a]
      
      







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



 left, right :: Universe a -> Universe a left (Universe (a:as) x bs) = Universe as a (x:bs) right (Universe as x (b:bs)) = Universe (x:as) b bs
      
      







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



 extract :: Universe a -> a extract (Universe _ x _) = x
      
      







рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Universe [-1, -2..] 0 [1, 2..]



рд╕рднреА рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, Universe [0, -1..] 1 [2, 3..]



рдПрдХ рд╣реА рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реЗ рдмрджрд▓реЗ рд╣реБрдП рд╕рдВрджрд░реНрдн (рд╣рдо рджреВрд╕рд░реЗ рддрддреНрд╡ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рдеред



integres_figure



рдпрджрд┐ рд╣рдо рд╕рднреА рдбрд┐рдЧреНрд░реА 2 рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ Universe



рдлрд╝рдВрдХреНрд╢рди (2**)



рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ:



 instance Functor Universe where fmap f (Universe as x bs) = Universe (fmap f as) (fx) (fmap f bs) --  powersOf2 = fmap (2**) (Universe [-1, -2..] 0 [1, 2..]) -- ..0.25, 0.5, 1, 2, 4..
      
      







рдПрдХ рд╕реЗрд▓реНрдпреВрд▓рд░ рдСрдЯреЛрдореЗрдЯрди рдореЗрдВ, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдорд╛рди рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рд╢рд┐рдлреНрдЯреЛрдВ рдХреЗ Universe



рдФрд░ рдЙрдирдХреЗ рджреГрдврд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:



 duplicate :: Universe a -> Universe (Universe a) duplicate u = Universe (tail $ iterate left u) u (tail $ iterate right u)
      
      







duplicate_figure



рдХрдирд╡рд┐рдХреНрд╢рди рд░реВрд▓ Universe a -> a



рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП Universe a -> a



, рдЗрд╕рд▓рд┐рдП Universe Bool



рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛:



 rule :: Universe Bool -> Bool rule u = lx /= cx where lx = extract $ left u cx = extract u
      
      







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



 next :: Universe a -> (Universe a -> a) -> Universe a next ur = fmap r (duplicate u) --  un = Universe (repeat False) True (repeat False) `next` rule
      
      







1d_gif



comonad



рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ:



 extract . duplicate = id fmap extract . duplicate = id duplicate . duplicate = fmap duplicate . duplicate
      
      







рдЗрд╕рд▓рд┐рдП, Universe



рдПрдХ рдХреЛрдореЛрдирдб рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ next



рдлрд╝рдВрдХреНрд╢рди рдСрдкрд░реЗрдЯрд░ (=>>)



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



, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдВрджрд░реНрдн рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рддрд╛ рд╣реИ; return



рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ extract



- рдЗрд╕рд╕реЗ рдЕрд░реНрдХ, рдЖрджрд┐ред



comonad_laws



рджреЛ рдЖрдпрд╛рдореА рд╕реЗрд▓реБрд▓рд░ automaton



рдЕрдм, рд╣рдо рд╕рд┐рд░реНрдл рджреЛ-рдЖрдпрд╛рдореА рд╕реЗрд▓реБрд▓рд░ рдСрдЯреЛрдореЗрдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ Universe



рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:

 newtype Universe2 a = Universe2 { getUniverse2 :: Universe (Universe a) }
      
      







рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, fmap



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



рд▓рд┐рдП Functor



рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдирд╛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА:



 instance Functor Universe2 where fmap f = Universe2 . (fmap . fmap) f . getUniverse2
      
      







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



рд▓рд┐рдП рджреЛ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, duplicate



рдореЗрдВ, рд╣рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╢рд┐рдлреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ



 instance Comonad Universe2 where extract = extract . extract . getUniverse2 duplicate = fmap Universe2 . Universe2 . shifted . shifted . getUniverse2 where shifted :: Universe (Universe a) -> Universe (Universe (Universe a)) shifted u = Universe (tail $ iterate (fmap left) u) u (tail $ iterate (fmap right) u)
      
      







рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рд╣реИ! рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ (=>>)



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдЧреЗрдо рдСрдл рд▓рд╛рдЗрдл рдореЗрдВ, рд╕реЗрд▓ рдХреА рдирдИ рд╕реНрдерд┐рддрд┐ рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:



 nearest3 :: Universe a -> [a] nearest3 u = fmap extract [left u, u, right u] neighbours :: (Universe2 a) -> [a] neighbours u = [ nearest3 . extract . left , pure . extract . left . extract , pure . extract . right . extract , nearest3 . extract . right ] >>= ($ getUniverse2 u)
      
      







рдФрд░ рдпрд╣рд╛рдБ рдирд┐рдпрдо рд╣реА рд╣реИ:



 data Cell = Dead | Alive deriving (Eq, Show) rule :: Universe2 Cell -> Cell rule u | nc == 2 = extract u | nc == 3 = Alive | otherwise = Dead where nc = length $ filter (==Alive) (neighbours u)
      
      







рдХреЗрд╡рд▓ рдПрдХ рдЙрдмрд╛рдК рдирд┐рд╖реНрдХрд░реНрд╖ рдмрдЪрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЕрд▓рдЧ рд╕реЗ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛ред



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



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХрд┐рд╕реА рднреА рд╕реЗрд▓реБрд▓рд░ рдСрдЯреЛрдореЗрдЯреЛрди рдХреЛ рдХреЗрд╡рд▓ рдПрдХ rule



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

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



рджреЛрдиреЛрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб:



Universe.hs
 module Universe where import Control.Comonad data Universe a = Universe [a] a [a] newtype Universe2 a = Universe2 { getUniverse2 :: Universe (Universe a) } left :: Universe a -> Universe a left (Universe (a:as) x bs) = Universe as a (x:bs) right :: Universe a -> Universe a right (Universe as x (b:bs)) = Universe (x:as) b bs makeUniverse fl fr x = Universe (tail $ iterate fl x) x (tail $ iterate fr x) instance Functor Universe where fmap f (Universe as x bs) = Universe (fmap f as) (fx) (fmap f bs) instance Comonad Universe where duplicate = makeUniverse left right extract (Universe _ x _) = x takeRange :: (Int, Int) -> Universe a -> [a] takeRange (a, b) u = take (b-a+1) x where Universe _ _ x | a < 0 = iterate left u !! (-a+1) | otherwise = iterate right u !! (a-1) instance Functor Universe2 where fmap f = Universe2 . (fmap . fmap) f . getUniverse2 instance Comonad Universe2 where extract = extract . extract . getUniverse2 duplicate = fmap Universe2 . Universe2 . shifted . shifted . getUniverse2 where shifted :: Universe (Universe a) -> Universe (Universe (Universe a)) shifted = makeUniverse (fmap left) (fmap right) takeRange2 :: (Int, Int) -> (Int, Int) -> Universe2 a -> [[a]] takeRange2 (x0, y0) (x1, y1) = takeRange (y0, y1) . fmap (takeRange (x0, x1)) . getUniverse2
      
      





Life.hs
 import Control.Comonad import Control.Applicative import System.Process (rawSystem) import Universe data Cell = Dead | Alive deriving (Eq, Show) nearest3 :: Universe a -> [a] nearest3 u = fmap extract [left u, u, right u] neighbours :: (Universe2 a) -> [a] neighbours u = [ nearest3 . extract . left , pure . extract . left . extract , pure . extract . right . extract , nearest3 . extract . right ] >>= ($ getUniverse2 u) rule :: Universe2 Cell -> Cell rule u | nc == 2 = extract u | nc == 3 = Alive | otherwise = Dead where nc = length $ filter (==Alive) (neighbours u) renderLife :: Universe2 Cell -> String renderLife = unlines . map concat . map (map renderCell) . takeRange2 (-7, -7) (20, 20) where renderCell Alive = "тЦИтЦИ" renderCell Dead = " " fromList :: a -> [a] -> Universe a fromList d (x:xs) = Universe (repeat d) x (xs ++ repeat d) fromList2 :: a -> [[a]] -> Universe2 a fromList2 d = Universe2 . fromList ud . fmap (fromList d) where ud = Universe (repeat d) d (repeat d) cells = [ [ Dead, Alive, Dead] , [Alive, Dead, Dead] , [Alive, Alive, Alive] ] main = do gameLoop $ fromList2 Dead cells gameLoop :: Universe2 Cell -> IO a gameLoop u = do getLine rawSystem "clear" [] putStr $ renderLife u gameLoop (u =>> rule)
      
      









рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП int_index рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред



All Articles