हास्केल - यह सूची समझदारी एक अनंत सूची क्यों लौटाती है?
[3 * x | x <- [1 ..], 3 * x < 20]
मैं वास्तव में नहीं समझता कि यह क्यों देता है
[3,6,9,12,15,18
और एक अंत नहीं मिल रहा है
जवाब
के शब्दार्थ
[3 * x | x <- [1 ..], 3 * x < 20]
के सभी तत्वों की कोशिश करना [1..]
और उन लोगों को फ़िल्टर स्थिति को संतुष्ट रखना है 3*x<20
।
एक मानव यह देख सकता है कि पहले के बाद x
जो स्थिति को गलत साबित करता है वह सभी बड़े मूल्यों की कोशिश करने का कोई मतलब नहीं है, लेकिन हास्केल उन लोगों की कोशिश करेगा, और एक तरह के अनंत लूप पर फंस जाएगा।
ऐसा इसलिए है, क्योंकि सामान्य स्थिति में, स्थिति एक बार फिर से सच हो सकती है, जैसे
[3 * x | x <- [1 ..], 3 * x < 20 || x == 1000000 ]
सामान्य तौर पर यह पता लगाना अस्वाभाविक है कि क्या कोई और समाधान नहीं है, इसलिए किसी अन्य प्रोग्रामिंग भाषा की तरह हास्केल अंतिम समाधान के बाद बंद करने का विकल्प नहीं चुन सकता है।
यदि आप चाहते हैं कि सूची पहले मूल्य के बाद बंद हो जाए जो फ़िल्टरिंग स्थिति को संतुष्ट नहीं करती है, तो उपयोग करें takeWhile
:
takeWhile (< 20) [3 * x | x <- [1 ..]]