Haskell - Bu liste anlayışı neden sonsuz bir liste döndürüyor?

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

Bunun neden verdiğini gerçekten anlamıyorum

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

Ve bir son bulmuyor

Yanıtlar

14 chi Jan 15 2021 at 23:37

Anlambilim

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

tüm öğelerini denemek [1..]ve filtre koşulunu karşılayanları korumaktır 3*x<20.

Bir insan x, koşulu tahrif eden ilk durumdan sonra tüm büyük değerleri denemenin bir anlamı olmadığını görebilir, ancak Haskell yine de bunları deneyecek ve bir tür sonsuz döngüye takılıp kalacaktır.

Bunun nedeni, genel durumda koşulun bir kez daha gerçek olabilmesidir, örn.

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

Genel olarak, başka çözüm olup olmadığını tespit etmek karar verilemez , bu nedenle Haskell, diğer herhangi bir programlama dili gibi, son çözümden sonra durmayı seçemez.

Listenin, filtreleme koşulunu karşılamayan ilk değerden sonra durmasını istiyorsanız, şunu kullanın takeWhile:

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