module Problem1 where -- a) turn180 = left >>> left right = left >>> turn180 backward = turn180 >>> forward >>> turn180 -- b) Forward s >>> t = Forward (s >>> t) TurnLeft s >>> t = TurnLeft (s >>> t) IfObstructed s t >>> u = IfObstructed (s >>> u) (t >>> u) Idle >>> s = s -- c) newtype S = S { unS :: Maze -> Ant -> Ant } forward :: S forward = S $ \maze ant -> if obstructed maze ant then ant else moveAnt ant ifObstructed :: S -> S -> S ifObstructed (S s) (S t) = S $ \maze ant -> if obstructed maze ant then s maze ant else t maze ant idle :: S idle = S $ \maze ant -> ant left :: S left = S $ \maze ant -> leftAnt ant (>>>) :: S -> S -> S S s >>> S t = S $ \maze ant -> t maze (s maze ant) navigate :: Maze -> Ant -> S -> Ant navigate maze ant (S s) = s maze ant