subsequencesOfSize :: Int -> [a] -> [[a]] subsequencesOfSize n xs | n > length xs = [] subsequencesOfSize n xs = subsequencesBySize xs !! n where subsequencesBySize [] = [[[]]] subsequencesBySize (x:xs) = zipWith (++) ([] : map (map (x:)) next) (next ++ [[]]) where next = subsequencesBySize xs main = do print $ length $ subsequencesOfSize 3 [1..350] print $ length $ subsequencesOfSize 147 [1..150]