2012-03-11 3 views
12

У меня есть три слова в списке ["a", "b", "c"]. я хочу, чтобы найти все возможные комбинации в набор 5,6 и т.д.Комбинации и перестановка Haskell

, например, для набора из 5 я бы

**[ [aaaaa],[aaaab],[aaaac], [aaabc] , ..... ]** etc 3^5 = 243 combinations 

Аааааа выше будет в основном «а», «а», «а» , «а», «а» ....

+0

Я работаю над этим со вчерашнего дня. не пошел намного дальше. если я получу какую-то идею, тогда я смогу это сделать. – Waqas

+2

@ user1115751: Для начала найдите «[файл haskell cartesian] (http://stackoverflow.com/search?q=haskell+cartesian+product&submit=search)». – kennytm

ответ

20

replicateM делает то, что вы хотите:

> import Control.Monad 
> replicateM 5 ["a", "b", "c"] 
[["a","a","a","a","a"],["a","a","a","a","b"],["a","a","a","a","c"],["a","a","a","b","a"],["a","a","a","b","b"],["a","a","a","b","c"],["a","a","a","c","a"],["a","a","a","c","b"],["a","a","a","c","c"],["a","a","b","a","a"],["a","a","b","a","b"],["a","a","b","a","c"],["a","a","b","b","a"],["a","a","b","b","b"],["a","a","b","b","c"]...] 
20

конечно, ответ nanothief дает самое короткое решение, но это может быть поучительно и интересно делать это самостоятельно ,

Существует множество способов написать функцию для декартова произведения. Например. Вы можете использовать списковые:

prod :: [[a]] -> [[a]] -> [[a]] 
prod as bs = [a ++ b | a <- as, b <- bs] 

Где (++) :: [a] -> [a] -> [a] - см Data.List. Другая возможность состоит в том, чтобы использовать Applicative экземпляр списка:

import Control.Applicative 

prod as bs = (++) <$> as <*> bs 

Теперь вам нужно применить эту операцию несколько раз. Откидна может сделать это, например .:

rep :: Int -> [[a]] -> [[a]] 
rep n as = foldr1 prod $ replicate n as 

rep 3 ['a','b','c'] 
--["aaa","aab","aac","aba","abb","abc","aca","acb","acc","baa","bab", 
--"bac","bba","bbb","bbc","bca","bcb","bcc","caa","cab","cac","cba", 
--"cbb","cbc","cca","ccb","ccc"] 

Понимание этого решения может быть более ценным, чем принимать replicateM короткую стрижку. Тем не менее, вы могли бы найти последнее легко, используя Hoogle.

-

Более подробной информации о функторах и Applicative определения см fmap (<$>) и ap (<*>). Functors, Applicatives, And Monads In Pictures также может быть хорошим ресурсом.

+0

Это не компилируется. Должно быть ограничение типа для операндов, переданных в '++' – dopatraman

+0

Я пробовал это в GHCi, там он работает без ограничений. – Landei

+0

Как бы вы могли изменить это для чисел, например? Или любой другой тип? – dopatraman

Смежные вопросы