Haskell - Mengapa pemahaman daftar ini mengembalikan daftar tak terbatas?
[3 * x | x <- [1 ..], 3 * x < 20]
Saya tidak begitu mengerti mengapa ini memberi
[3,6,9,12,15,18
Dan tidak menemukan akhir
Jawaban
Semantik dari
[3 * x | x <- [1 ..], 3 * x < 20]
adalah mencoba semua elemen [1..]
dan mempertahankan yang memenuhi kondisi filter 3*x<20
.
Manusia dapat melihat bahwa setelah yang pertama x
memalsukan kondisi, tidak ada gunanya mencoba semua nilai yang lebih besar, tetapi Haskell akan tetap mencobanya, dan terjebak pada semacam putaran tak terbatas.
Ini karena, dalam kasus umum, kondisi tersebut bisa menjadi benar sekali lagi, misalnya
[3 * x | x <- [1 ..], 3 * x < 20 || x == 1000000 ]
Secara umum tidak dapat diputuskan untuk mendeteksi apakah tidak ada solusi lagi, jadi Haskell, seperti bahasa pemrograman lainnya, tidak dapat memilih untuk berhenti setelah solusi terakhir.
Jika Anda ingin daftar berhenti setelah nilai pertama yang tidak memenuhi kondisi pemfilteran, gunakan takeWhile
:
takeWhile (< 20) [3 * x | x <- [1 ..]]