Haskell - Bu liste anlayışı neden sonsuz bir liste döndürüyor?
[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
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 ..]]