2012-03-11 15 views
12

मेरे पास सूची में तीन शब्द हैं ["ए", "बी", "सी"]। मैं में हर संभव संयोजन को खोजने के लिए चाहते हैं निर्धारित 5,6 आदिहास्केल संयोजन और क्रमपरिवर्तन

5 के सेट के लिए उदाहरण के लिए मैं

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

aaaaaa ऊपर होता है मूल रूप से "एक", "एक", हो जाएगा "एक" , "एक", "एक" ....

+0

मैं कल से इस पर काम कर रहा हूं। बहुत आगे नहीं गए। अगर मुझे कुछ विचार मिल सकता है तो मैं इसे करने में सक्षम हो सकता हूं। – Waqas

+2

@ user1115751: शुरू करने के लिए, "[हैकेल कार्टेशियन उत्पाद] (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 का जवाब कम से कम समाधान देता है, लेकिन यह शिक्षाप्रद हो सकता है और मज़ा यह अपने आप को ऐसा करने के लिए ।

कार्टेशियन उत्पाद के लिए फ़ंक्शन लिखने के कई तरीके हैं। जैसे आप सूची comprehensions उपयोग कर सकते हैं:

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

कहाँ (++) :: [a] -> [a] -> [a] - Data.List देखते हैं।

import Control.Applicative 

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

अब आप बार-बार इस आपरेशन लागू करने की आवश्यकता: एक और संभावना सूची के Applicative उदाहरण उपयोग करने के लिए है। एक गुना ऐसा कर सकते हैं, उदा .:

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 का उपयोग कर पाएंगे।

-

पर functors और अनुप्रयोगी अधिक जानकारी के लिए परिभाषाएँ fmap (<$>) और ap (<*>) देखें। Functors, Applicatives, And Monads In Pictures भी एक अच्छा संसाधन हो सकता है।

+0

यह संकलित नहीं करता है। '++ ' – dopatraman

+0

पर भेजे गए ऑपरेटरों के लिए एक प्रकार की बाधा होनी चाहिए, मैंने इसे जीएचसीआई में करने की कोशिश की, वहां यह बाधाओं के बिना काम करता है। – Landei

+0

उदाहरण के लिए, आप संख्याओं के लिए इसे कैसे संशोधित करेंगे? या कोई अन्य प्रकार? – dopatraman

संबंधित मुद्दे