Haskell - Mengapa pemahaman daftar ini mengembalikan daftar tak terbatas?

Jan 16 2021
[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

14 chi Jan 15 2021 at 23:37

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