मुझे लगता है कि सूची समझ का विस्तार इस पढ़ने में आसान बनाता है:
[ 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
एस आलसी मूल्यांकन के कारण सस्ते होते हैं (जबकि वे उत्सुक भाषाओं में घातक हैं)।
'उदाहरण के लिए मोनाड [] ',' (>> =) == फ्लिप कॉन्सटैप' ... ऐसा लगता है कि क्रिस का जवाब उस भाग पर चमक गया है, लेकिन यह उत्तर उपरोक्त में से एक का सबसेट है। – ephemient