リストによる正方行列

cf. 今日の一行 – リストによる正方行列処理

問題1。

matrix n = [[x+(n^2*y) | x <- [1..n^2]] | y <- [0..n^2-1]]
*Main> matrix 2
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
*Main> matrix 3
[[1,2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17,18],[19,20,21,22,23,24,25,26,27],[
28,29,30,31,32,33,34,35,36],[37,38,39,40,41,42,43,44,45],[46,47,48,49,50,51,52,5
3,54],[55,56,57,58,59,60,61,62,63],[64,65,66,67,68,69,70,71,72],[73,74,75,76,77,
78,79,80,81]]

問題2。
Data.Listtranspose そのままでは芸がないので。

transpose' m = [[m!!x!!y| x <- [0..l]] | y <- [0..l]]
  where
    l = length m - 1
*Main> transpose' $ matrix 2
[[1,5,9,13],[2,6,10,14],[3,7,11,15],[4,8,12,16]]

問題3はあとで。

追記:
問題2の別解。foldr を使う。これなら正方行列でなくてもOK。

transpose'2 m = foldr (\a b -> zipWith (:) a b) (replicate (length m) []) m
*Main> transpose'2 $ matrix 2
[[1,5,9,13],[2,6,10,14],[3,7,11,15],[4,8,12,16]]