2015-05-01 3 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 | (i, 't') <- zip-лист (шаблон цикла)] 'работает. –

Смежные вопросы