2次元のリストの指定した座標を含むブロックの座標を列挙する

タイトルがわかりにくいな。
ホントは図を描けばいいのかもしれないけど、まず、2次元のリストを考える。で、そのリストの中に3×3のブロックが並んでいると考えてほしい。今日やりたいのは、ある座標(インデックス、0始まり、2次元なので当然2つの整数)を与えたときに、その座標を含むブロックの全座標を列挙したいってこと。
最初、どうやったらいいか悩んだけど、出来てみれば案外簡単だった。

module Main where

import System.Environment (getArgs)

block :: Int -> Int -> [(Int, Int)]
block i j = [(x,y)| x <- section i, y <- section j]

section :: Int -> [Int]
section n = [s..e]
  where
    s = n `div` 3 * 3
    e = s + 2

main :: IO ()
main = do
  args <- getArgs
  let i = read (args !! 0) :: Int
  let j = read (args !! 1) :: Int
  print $ block i j

実行例:

takatoh@apostrophe $ runhaskell block.hs 4 2
[(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(5,0),(5,1),(5,2)]
takatoh@apostrophe $ runhaskell block.hs 1 5
[(0,3),(0,4),(0,5),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)]

こんな感じ。