2014-03-31 46 views
0

我正在做一個函數,它帶有一個布爾函數和兩個列表。它需要遍歷第一個列表,以及使布爾函數true的索引返回第二個列表的相應元素。Haskell:使用列表來訪問索引

例如..

filterAB (>0) [-2, -1, 0, 1, 2] [5, 2, 5, 9, 0] 

將返回:

[9, 0] 

我使用findIndices返回從第一個列表中選擇正確的索引,使布爾函數真正的列表,以便我可以使用它們來訪問第二個列表中的元素。這是我到目前爲止的代碼:

filterAB boolFunc listA listB = take listC listB where 
listC = findIndices boolFunc listA 

不幸的是,線

take listC listB 

不起作用,因爲取功能需要int類型的符而listC是鍵入[INT]

任何幫助將不勝感激!

+0

我知道會拿不是正確的功能無論如何,我會想listB的東西! listC – Edge

回答

6

而且使用簡單列表內涵...

[ghci] let filterAB f as bs = [ b | (a, b) <- zip as bs, f a] 
[ghci] filterAB (>0) [-2,-1,0,1,2] [5,2,5,9,0] 
[9,0] 
[ghci] 
+0

我總是忘記使用列表解析,在這裏它確實是最短和更可讀的方式來做到這一點! –

+0

謝謝呂克。對於Haskell而言,我還是個新手List Comprehensions與我通常使用的Python最爲接近,所以我一般都會使用它。無點記號仍然困擾着我:)。 – ssm

1

試試這個

filterAB f (x:xs) (y:ys) 
    | f x = y : filterAB f xs ys 
    | otherwise = filterAB f xs ys 
filterAB _ _ _ = [] 

Real World HaskellChapter 3. Defining Types, Streamlining Functions給出這裏所涉及的語法的一個很好的解釋。


測試:

*Main> filterAB (>0) [-2,-1,0,1,2] [5,2,5,9,0] 
[9,0] 
*Main> filterAB (>0) [-2,-1,0,1,2] [5,2,5,9] 
[9] 
*Main> filterAB (>0) [-2,-1,0,1,2] [5,2,5] 
[] 
*Main> filterAB (>0) [-2,-1,0] [5,2,5,9,0] 
[] 
*Main> 
+0

對不起。我不確定那是什麼,它不編譯。 – Edge

+1

@Edge我在GHCi中測試過,效果很好。 –

+0

你可以向我解釋語法嗎? – Edge

6

的其他版本:

filterAB f l1 l2 = map snd $ filter (f . fst) $ zip l1 l2 

如果你瞭解$困難,這個版本是相同的:

let filterAB f l1 l2 = map snd (filter (f . fst) (zip l1 l2)) 

拉鍊帶兩個列表並將其轉換爲一個t列表uple。例如:

zip [1,2,3,4] ["un", "deux", "trois", "quatre"] == [(1,"un"),(2,"deux"),(3,"trois"),(4,"quatre")] 

過濾器採取的列表,並且該列表中的每個元素的虛假返回true,並將其過濾功能,它就像你的filterAB但在簡單:

filter (>0) [-1, 2, -2, 3, -3] == [2,3] 

FST採取夫婦並返回第一個元素,所以f。 fst會將f應用於元組的第一個元素。這樣的過濾器(˚FFST)允許使用通過僅考慮每個元組的第一個元素的元組的列表過濾:

filter (odd . fst) [(1,"un"),(2,"deux"),(3,"trois"),(4,"quatre")] == [(1,"un"),(3,"trois")] 

如果你沒有得到的點,它只是功能組成,以在未來兩條線是相同的:

h = f . g 
h = f (g x) 

snd取一對並返回第二個元素。地圖使用它,讓我們把元組的列表,只返回元組的第二個元素的列表:

map snd [(1,"un"),(2,"deux"),(3,"trois"),(4,"quatre")] == ["un","deux","trois","quatre"] 
+0

非常感謝你。我實際上在你解釋的幫助下理解了這一點。我仍然需要使用模式匹配來實踐第一個解決方案。我想過使用zip,但我不知道如何訪問夫婦的個人元素。再次感謝yall。 – Edge