import Data.Array (Array, (!), (//), bounds, listArray) -- matrixes :: Int -> [[(Int, Int)]] matrixes n = go 1 . listArray (1, 9) . repeat $ 9 where go :: Int -> Array Int Int -> [[Int]] go i rs = let maxIndex = snd (bounds rs) r = rs ! i in if i > maxIndex then [] else if r == 0 then go (i + 1) rs else map (i :) (go 1 (rs // [(i, (rs ! i) - 1)])) ++ go (i + 1) rs