Haskell - เหตุใดความเข้าใจในรายการนี้จึงส่งคืนรายการที่ไม่มีที่สิ้นสุด

Jan 15 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ที่ปลอมเงื่อนไขไม่มีจุดที่จะลองใช้ค่าที่ใหญ่กว่าทั้งหมด แต่ Haskell จะลองใช้สิ่งเหล่านี้ต่อไปและติดอยู่กับการวนซ้ำที่ไม่มีที่สิ้นสุด

เนื่องจากในกรณีทั่วไปเงื่อนไขอาจกลายเป็นจริงได้อีกครั้งเช่น

[3 * x | x <- [1 ..], 3 * x < 20 || x == 1000000 ]

โดยทั่วไปแล้วจะไม่สามารถตัดสินใจได้ว่าจะไม่มีวิธีแก้ไขเพิ่มเติมหรือไม่ดังนั้น Haskell เช่นเดียวกับภาษาโปรแกรมอื่น ๆ จึงไม่สามารถเลือกที่จะหยุดหลังจากการแก้ปัญหาสุดท้ายได้

หากคุณต้องการให้รายการหยุดหลังจากค่าแรกซึ่งไม่เป็นไปตามเงื่อนไขการกรองให้ใช้takeWhile:

takeWhile (< 20) [3 * x | x <- [1 ..]]