partition :: Integer -> Integer -> [[Integer]] partition total 1 = [[total]] partition total numparts = concat $ map (prepend) [total, (total - 1) .. 0] where prepend x = map (x:) (subpart x) subpart x = partition (total - x) (numparts - 1) -- then: partition 100 5