按布尔模式的子列表

时间:2015-05-01 07:14:29

标签: haskell

我需要从奇数位置的列表元素中提取。在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]

1 个答案:

答案 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}}箍跳。