2009-02-20 15 views
6

तो, उदाहरण के लिए, कहें कि मेरे पास संख्याओं की एक सूची थी और मैं एक सूची बनाना चाहता था जिसमें प्रत्येक संख्या 2 और 3 गुणा हो। 3. क्या निम्न की तरह कुछ करने का कोई तरीका है, लेकिन संख्याओं की एक सूची वापस प्राप्त करें संख्याओं की सूचियों की सूची के बजाय?क्या आप एक समय में सूची के एक से अधिक तत्व बना सकते हैं जिसमें हैकेल में सूची समझ हो?

mult_nums = [ [(n*2),(n*3)] | n <- [1..5]] 
-- this returns [[2,3],[4,6],[6,9],[8,12],[10,15]] 
-- but we want [2,3,4,6,6,9,8,12,10,15] 

उत्तर

13

आप Concat का उपयोग कर सकते हैं।

concat [ [(n*2),(n*3)] | n <- [1..5]] 
output: [2,3,4,6,6,9,8,12,10,15] 
5

कुछ इसी तरह के मामलों में concatMap भी सुविधाजनक हो यहाँ हालांकि यह ज्यादा परिवर्तन नहीं करता है सकते हैं:

concatMap (\n -> [n*2,n*3]) [1..5]
+0

'उदाहरण के लिए मोनाड [] ',' (>> =) == फ्लिप कॉन्सटैप' ... ऐसा लगता है कि क्रिस का जवाब उस भाग पर चमक गया है, लेकिन यह उत्तर उपरोक्त में से एक का सबसेट है। – ephemient

17

मुझे लगता है कि सूची समझ का विस्तार इस पढ़ने में आसान बनाता है:

[ m | n <- [1..5], m <- [2*n,3*n] ] 

यह जांचने में सहायक हो सकता है कि यह वास्तव में क्या करता है, और यह अन्य समाधानों से कैसे संबंधित है। के एक समारोह के रूप में यह परिभाषित करते हैं: इस desugars को

mult' lst = 
    concatMap (\n -> concatMap (\m -> [m]) [2*n,3*n]) lst 

अभिव्यक्ति concatMap (\m -> [m])m क्रम में तुरंत समतल करने के लिए एक सूची में लपेटकर है,

mult lst = [ m | n <- lst, m <- [2*n,3*n] ] 

एक फैशन के बाद यह — यह map id के बराबर है ।

@ FunctorSalad का जवाब करने के लिए इस की तुलना करें:

mult1 lst = concatMap (\n -> [n*2,n*3]) lst 

हम दूर concatMap (\m -> [m]) अनुकूलन किया है।

अब @ विली का जवाब:

mult2' lst = concat (concatMap (\n -> [[2*n,3*n]]) lst) 

पहला समाधान ऊपर, हम अनावश्यक रूप से सूचियों हम concat को दूर किया है की एक सूची बना रहे हैं के रूप में:

mult2 lst = concat [ [(n*2),(n*3)] | n <- lst] 

यह करने के लिए desugars।

मुझे नहीं लगता कि वहां एक समाधान है जो सूची समझ का उपयोग करता है, लेकिन mult1 के लिए desugars। मेरा अंतर्ज्ञान यह है कि हास्केल कंपाइलर्स आमतौर पर पर्याप्त चालाक होते हैं कि इससे कोई फर्क नहीं पड़ता (या, वैकल्पिक रूप से, अनावश्यक concat एस आलसी मूल्यांकन के कारण सस्ते होते हैं (जबकि वे उत्सुक भाषाओं में घातक हैं)।

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

  • कोई संबंधित समस्या नहीं^_^