2014-03-31 37 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