2015-05-01 81 views
1

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

回答

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 - fst箍跳。

+3

這是至少從我的角度來看,列表理解更容易閱讀的情況之一:'extractByPattern pattern list = [i | (i,t)< - zip list(循環模式),t =='t']' – Zeta

+0

@Zeta您的解決方案非常優雅 –

+5

@Zeta:'[i | (我,'噸')< - 郵編列表(循環模式)]'也可以。 –