let
, where
'un bir yolu var mı yoksa alt terimleri bir liste kavrayışında tanımlayın, böylece hem terim hem de kısıtlamada kullanılabilir mi? Benim Deneme yaparken itibarenhaskell - liste kavramasında eşdeğer nerede?
aşağıdaki çalışma:
[let x = i*i in x | i<-[1..10], i*i > 20] --good
[i*i | i<-[1..10], let x=i*i in x > 20] --good
Fakat bu kapsam bc yok:
[let x = i*i in x | i<-[1..10], x > 20] -- 'x' not in scope error
let x = i*i in [x | i<-[1..10], x > 20] -- 'i' not in scope error
[x | i<-[1..10], x > 20] where x = i*i --parse error on 'where'
Yani bir yerde veya diğerinde let
eserler, ancak ikisini bir arada!
Çalışmasını sağlamanın tek yolu (yani, yinelenen ifadelerden ve olası değerlendirmelerden kaçınmak), aşağıdaki soruna (Euler project 38) x<-[e38cat i [1..k]
kodlu bir tek liste halinde eklemek liste anlama: çok verimsiz görünmüyor tho yukarıda önemsiz örneği contunuing
> let e38cat x l = foldl1 (++) $ map show [x*i | i<-l]
maximum [x| i<-[1..9999], k<-[2..div 10 $ length $ show i], x<-[e38cat i [1..k]], sort x == "123456789"]
"932718654"
Veya,
[x | i<-[0..10], x<-[i*i], x > 20] --works
Bu, biraz aptalca görünüyor ve biraz netlik yoksundur. Yine de, let
veya where
tüm anlamada işe yarayacaktır. Bu yapılabilir mi?
İkinci örneğiniz, '[x | i <- [1..10], x = i * i x> 20] 'ye izin vermeyin; demek istediniz [i * i | i <- [1..10], x = i * i x> 20] 'ye izin verin? –
evet, teşekkürler. ilk çalıştı eğer ben kendi soru –