Kendimi Erik Meijer'in Kanal 9 web yayınlarından Haskell'e öğretmeye çalışan bir C# adamıyım. Zip ve mod kullanarak bir listenin her 'n' öğesini atlamayı içeren ilginç bir bulmacanın karşısına çıktım.Haskell'de sonsuz yinelenen liste nasıl oluşturulur?
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]
Bence mod kullanarak önlemek olabilir eğer (gerçekten büyük listeleri veya akışları için) daha verimli olabileceğini düşünüyorum.
Tembel bir yinelenen tamsayılar listesi oluşturarak tembelce düşündüm, böylece basitçe i'nin n değerini karşılaştırabiliriz.
repeatInts :: Int -> [Int]
şekilde repeatInts 3
döndürür [1,2,3,1,2,3,1,2,3,1,2,3,..]
sonsuza çağırarak.
bu göz önüne alındığında, şöyle every
yeniden tanımlamak olabilir:
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]
Yani benim sorular olduğunu: nasıl repeatInts
uygulamak?
Cf. http://stackoverflow.com/questions/2026912/how-to-get-every-nth-element-of-an-infinite-list-in-haskell –