grid :: [(Integer, Integer)] grid = f (0,0) where f (x,y) = (x,y) : f next where next | x == 0 && y == 0 = right | x > 0 && y < 0 && abs x <= abs y = left | x > 0 && y <= 0 = down | x < 0 && y < 0 && abs x >= abs y = up | x <= 0 && y < 0 = left | x < 0 && y > 0 && abs x <= abs y = right | x < 0 && y >= 0 = up | x > 0 && y > 0 && abs x > abs y = down | x >= 0 && y > 0 = right left = (x-1,y) right = (x+1,y) up = (x,y+1) down = (x,y-1) gridInCircle :: Integer -> [(Integer, Integer)] gridInCircle r | r > 0 = [p | p@(x,y) <- takeWhile ((r,r)/=) grid, x^2+y^2<=r^2] | otherwise = [] main :: IO () main = do print $ take 25 grid print $ gridInCircle 2