हास्केल - यह सूची समझदारी एक अनंत सूची क्यों लौटाती है?

Jan 16 2021
[3 * x | x <- [1 ..], 3 * x < 20]

मैं वास्तव में नहीं समझता कि यह क्यों देता है

[3,6,9,12,15,18

और एक अंत नहीं मिल रहा है

जवाब

14 chi Jan 15 2021 at 23:37

के शब्दार्थ

[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 ..]]