2012-03-11 16 views
12

Bir listede üç kelimem var ["a", "b", "c"]. i mümkün olan tüm kombinasyonunu bulmak istiyorum 5,6 vbHaskell kombinasyonları ve permütasyon

5 set için örneğin ben yukarıda

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

aaaaaa olurdu temelde "a", "a", olacaktır set "a" "a", "a" ....

+0

Dünden bu yana çalışıyorum. daha fazla gitmedi. eğer bir fikrim olursa, bunu yapabilirim. – Waqas

+2

@ user1115751: Başlamak için, "[haskell cartesian product] (http://stackoverflow.com/search?q=haskell+cartesian+product&submit=search)" araması yapın. – kennytm

cevap

20

replicateM istediğini yapar:

elbette
> 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 cevabı en kısa çözümü verir, ancak öğretici olabilir ve eğlenceli kendiniz yapmak . Kartezyen ürün için bir fonksiyon yazmanın birçok yolu vardır. Örneğin. Eğer liste türetimi kullanabilirsiniz:

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

Nerede (++) :: [a] -> [a] -> [a] - Data.List bakın.

import Control.Applicative 

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

Şimdi tekrar tekrar bu işlemi uygulamak gerekir: Bir başka olasılık listesinin Applicative örneğini kullanmaktır. Bu çözümü anlamak yapabilirsiniz Bir kat, ör .:

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 kısa kesim alarak daha değerli olabilir. Yani, Hoogle'u kullanarak ikincisi kolayca bulabilirdiniz.

- Funktorlar ve uygulanabilir ilgili daha fazla bilgi için

için tanımlar fmap (<$>) ve ap (<*>) görüyoruz. Functors, Applicatives, And Monads In Pictures da iyi bir kaynak olabilir.

+0

Bu, derlenmiyor. '++ ' – dopatraman

+0

' a geçilen işlenenler için bir tür kısıtlama olmalı ve bunu GHCi'de denedim, kısıtlama olmadan çalışıyor. – Landei

+0

Numaralar için bunu nasıl değiştirirsiniz örneğin? Ya da başka bir türü? – dopatraman