कार्यक्रम '0' और '1' लंबाई एन के सभी संभव संयोजनों वापसी के बारे में सवालमेरी पहली Haskell कार्यक्रम
addToElement :: String -> String -> String
addToElement element symbol = element ++ symbol
addOneToElement :: String -> String
addOneToElement element = addToElement element "1"
addZeroToElement :: String -> String
addZeroToElement element = addToElement element "0"
processListOnce :: [String] -> [String]
processListOnce lst = do
let s1 = map addOneToElement lst
let s2 = map addZeroToElement lst
s1 ++ s2
processList :: [String] -> Integer -> [String]
processList lst 1 = processListOnce lst
processList lst n = do
let tmp = processListOnce(lst)
processList tmp (n - 1)
{-
processList2 :: [String] -> Integer -> [String]
processList2 lst n = iterate (map processListOnce) lst !! n
-}
main = do
let s = processList ["0", "1"] 2
let ss = show s
putStrLn ss
यह अगर तुम मेरी मदद मेरी पहली हास्केल प्रोग्राम तो मैं आभारी होंगे है:
सबसे पहले सभी pls मेरे कोड हास्केल-मार्ग को दोबारा प्रतिक्रिया दें। मैं पहले से ही एक जादू refactring पता:
Control.Monad.replicateM n [0,1]
लेकिन इस समाधान का अध्ययन प्रयोजनों :) लिए अच्छा नहीं है
मैं ProcessList2 बजाय ProcessList क्यों उपयोग नहीं कर सकते और त्रुटि मिलती है:
all_possible_combinations.hs:44:51: Couldn't match expected type `[Char]' against inferred type `Char' Expected type: [String]] Inferred type: [String] In the second argument of `iterate', namely `lst' In the first argument of `(!!)', namely `iterate (map processListOnce) lst'
क्या प्रक्रिया सूची में 'tmp' चर को छोड़ने (उपयोग नहीं) करने का कोई तरीका है? मैंने कोशिश की है, लेकिन त्रुटि मिली:
processList :: [String] -> Integer -> [String] processList lst 1 = processListOnce lst processList lst n = processList processListOnce(lst) (n - 1) all_possible_combinations.hs:39:32: Couldn't match expected type `[String]' against inferred type `[String] -> [String]' In the first argument of `processList', namely `processListOnce' In the expression: processList processListOnce (lst) (n — 1) In the definition of `processList': processList lst n = processList processListOnce (lst) (n — 1)
अग्रिम धन्यवाद।
+1 सुंदर कोड :-) – fortran
पाठक आश्चर्यचकित हो सकता है कि यह वास्तव में प्रतिलिपि के रूप में गैर-जादुई (गैर-) जादुई है - वास्तव में, यह वही है जो 'प्रतिकृति एम एन [0,1] 'करता है। [0,1] पर इस परिभाषा को सारणीबद्ध करना (यानी, इसे हार्ड-कोडेड के बजाय पैरामीटर बनाना), यह परिभाषा तब सूची के लिए _exactly_ replicateM होगी। [[]] को 'वापसी []' में बदलना और 'समान' ऑपरेशन के साथ 'डू' ब्लॉक की सूची समझ प्रतिलिपि बनाने की पूरी तरह से उपयुक्त परिभाषा उत्पन्न करेगी। मुझे एक महत्वाकांक्षी Haskelist के लिए एक अच्छा अभ्यास की तरह लगता है :) – mokus
@mokus यदि दो कार्यों ने एक ही काम नहीं किया है, तो यह सही नहीं होगा? = डी लेकिन वास्तव में 'replicateM n x' को नियंत्रण में' अनुक्रम (प्रतिलिपि एन एक्स) 'के रूप में परिभाषित किया गया है। मोनाड और अनुक्रम को फ़ोल्डर का उपयोग करके परिभाषित किया गया है। हालांकि सूचीकरण को अपमानित करते हुए हमें 'f 0 = वापसी []' और 'f n = do {x <- [0,1]; xs <- f (n-1); वापसी (x: xs)}'। तो प्रतिकृति एम एफ में किए गए रिकर्सन करने के लिए एक सूची का उपयोग करता है। लेकिन जैसा कि आप कहते हैं कि यह एक प्रतिलिपि बनाने के लिए पूरी तरह से उपयुक्त होगा। – HaskellElephant