我最近需要跨越一个列表,以便只看到一些元素。这是一个过滤功能,但它不是那么简单。但首先,这是一个跨步。
跨越一个列表——或任何可遍历的类型——与折叠它是一样的,但会丢弃一些经常遇到的元素(关于步幅值)。我们挑选一个元素,然后挑选的下一个值将是下一个步幅。例如,如果我们将一个跨步值设置为 0 的列表进行跨步,我们实际上得到的列表是不变的。如果我们在列表中跨步 1,我们会在两个元素上得到一个元素:
stride 0 [1..10] == [1..10]
stride 1 [1..10] == [1,3,5,7,9]
stride 2 [1..10] == [1,4,7,10]
我看了看Data.List
,我没有找到stride
一个列表。这就是为什么我编写了一个函数来跨越我的 - 和你的!- 东西:
import Data.DList
-- for Data.List
stride :: (Num a, Eq a) => a -> [b] -> [b]
stride s = toList . snd . foldl (\(sa,xa) x -> if sa == s then (0,xa `snoc` x) else (sa+1,xa)) (s,fromList [])
你可以像上面一样使用它。是否可以提议将其作为Data.List
模块的一部分?我认为它可以帮助很大。