remove_every_nth :: Int -> [a] -> [a]
remove_every_nth n = foldr step [] . zip [1..]
where step (i,x) acc = if (i `mod` n) == 0 then acc else x:acc
İşte
işlevi yaptığı da budur:
zip [1..]
listedeki endekse tüm öğeleri kullanılır, bu nedenle örneğin zip [1..] "foo"
, [(1,'f'), (2,'o'), (3,'o')]
olur.
Dizinlenmiş liste daha sonra n
tarafından dizinine bölünemeyen her öğeyi biriktiren bir right fold ile işlenir.
Burada aslında aynı şeyi yapan biraz daha uzun bir sürüm var, ancak zip [1..]
ek bellek ayırmalarını önler ve modül hesaplaması gerekmez.
remove_every_nth :: Int -> [a] -> [a]
remove_every_nth = recur 1
where recur _ _ [] = []
recur i n (x:xs) = if i == n
then recur 1 n xs
else x:recur (i+1) n xs
yerine' zip' ve 'mod' dizenin – Peaker
'remove_every_nth n = harita snd. filtre ((/ = 0). (\ 'mod \ n) fst). Posta [1 ..] ' – Alvivi
@Peaker: öneri için teşekkür ederiz. "Zip" kullanmadan döngüyü nasıl kullanacağınızdan emin değilim, ama verimliliği biraz farklı bir şekilde geliştirdim. 'RemoveEveryNth n = haritası snd:' cycle' ile – shang