我需要从奇数位置的列表元素中提取。在Data.List库中,我发现了一些关于。所以我创建了以下功能。我想知道是否有一个包含此函数和其他类似函数的库,并且是否可以显着重构我的函数。感谢。
extractByPattern p l = extractByPatternRaw bp l
where
bp = map (== 't') p
extractByPatternRaw p l = foldr select [] coupledList
where
coupledList = zip (concat . repeat $ p) l
select (b,x) acc
| b = x : acc
| otherwise = acc
oddPos = extractByPattern "tf"
-- ex. oddPos [1..20] == [1,3,5,7,9,11,13,15,17,19]
everyTwoAndFivePos = extractByPattern "ftfft"
-- ex. everyTwoAndFivePos [1..20] == [2,5,7,10,12,15,17,20]
答案 0 :(得分:3)
作为替代方案:
λ map fst $ filter snd $ zip [1..20] $ cycle . map (== 't') $ "ftfft"
[2,5,7,10,12,15,17,20]
所以你可以做以下的事情:
extractByPattern pattern list = map fst $ filter snd $ zip list $ cycle . map (== 't') $ pattern
Hoogle中[Bool] -> [a] -> [a]
或[a] -> [Bool] -> [a]
没有任何内容,这会保存zip
- filter
- snd
- map
- { {1}}箍跳。