пятница, 18 мая 2007 г.

Комбинации

Казалось бы просто, но это заняло у меня два часа, чтобы написать такую функцию. Но теперь я знаю истинную природу вещей!
combr :: [[a]] -> [[a]]
combr [l] = map (\x -> [x]) l
combr (l : tl) = concat $ map (\ll -> map (:ll) l) $ combr tl

print $ combr [[1,2], [3,4], [5,6,7]]

[[1,3,5],[2,3,5],[1,4,5],[2,4,5],[1,3,6],[2,3,6],[1,4,6],
[2,4,6],[1,3,7],[2,3,7],[1,4,7],[2,4,7]]