Haskell - เหตุใดความเข้าใจในรายการนี้จึงส่งคืนรายการที่ไม่มีที่สิ้นสุด
[3 * x | x <- [1 ..], 3 * x < 20]
ฉันไม่เข้าใจจริงๆว่าทำไมถึงให้สิ่งนี้
[3,6,9,12,15,18
และไม่พบจุดจบ
คำตอบ
14 chi
ความหมายของ
[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 ..]]