What about using Vector (for fast indexing and slicing) and use a 1D array? Maybe something as simple as this?
import Data.Vector hiding (elem)
import Prelude hiding (length)
ncols :: Int
ncols = 4
row :: Int -> Vector a -> Vector a
row i = slice (i * ncols) ncols
col :: Int -> Vector a -> Vector a
col i v = let idxs = [i, i + ncols .. length v]
in ifilter (\i _ -> i `elem` idxs) v
diag :: Int -> Vector a -> Vector a
diag i v = let idxs = [i, i + ncols + 1 .. length v]
in ifilter (\i _ -> i `elem` idxs) v
v :: Vector Char
v = fromList "bwylailqhwraoqed"
main :: IO ()
main = do
print v
print $ row 0 v
print $ col 0 v
print $ diag 0 v
L.