List Haskell:使用列表访问索引

List Haskell:使用列表访问索引,list,haskell,List,Haskell,我正在做一个函数,它包含一个布尔函数和两个列表。它需要遍历第一个列表,对于使布尔函数为true的索引,它需要返回第二个列表的相应元素 例如 filterAB (>0) [-2, -1, 0, 1, 2] [5, 2, 5, 9, 0] 将返回: [9, 0] 我使用findIndices从第一个列表返回一个正确的索引列表,使布尔函数为true,以便使用它们访问第二个列表的元素。以下是我目前的代码: filterAB boolFunc listA listB = take listC l

我正在做一个函数,它包含一个布尔函数和两个列表。它需要遍历第一个列表,对于使布尔函数为true的索引,它需要返回第二个列表的相应元素

例如

filterAB (>0) [-2, -1, 0, 1, 2] [5, 2, 5, 9, 0]
将返回:

[9, 0]
我使用findIndices从第一个列表返回一个正确的索引列表,使布尔函数为true,以便使用它们访问第二个列表的元素。以下是我目前的代码:

filterAB boolFunc listA listB = take listC listB where
listC = findIndices boolFunc listA
不幸的是,这条线

take listC listB
不起作用,因为take函数需要类型Int作为说明符,而listC是类型[Int]

任何帮助都将不胜感激

试试这个

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

当然,我们对这里涉及的语法做了很好的解释


测试:

*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> 
另一个版本:

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 ))
zip将两个列表转换为一个元组列表。例如:

zip [1,2,3,4] ["un", "deux", "trois", "quatre"] == [(1,"un"),(2,"deux"),(3,"trois"),(4,"quatre")]
filter获取一个列表和一个函数,该函数为列表中的每个元素返回true或false,并对其进行筛选,这与filterAB类似,但更简单:

filter (>0) [-1, 2, -2, 3, -3] == [2,3]
fst取一对并返回第一个元素,因此f。fst将在元组的第一个元素上应用f。与此类似,过滤器(f.fst)允许用户通过只考虑每个元组的第一个元素来过滤元组列表:

filter (odd . fst)  [(1,"un"),(2,"deux"),(3,"trois"),(4,"quatre")] == [(1,"un"),(3,"trois")]
如果你没有得到点,那只是函数合成,所以接下来的两行是相同的:

h = f . g
h = f ( g x )
snd取一对并返回第二个元素。将其与map一起使用,可以获取一个元组列表,并仅返回元组第二个元素的列表:

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

也使用简单的列表理解

[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] 
[ghci]设filterAB f为bs=[b |(a,b)0][-2,-1,0,1,2][5,2,5,9,0]
[9,0]
[ghci]

抱歉。我不确定这是做什么用的,它也不能编译。你能给我解释一下语法吗?@Edge你能告诉我你不懂的部分吗?不管怎样,我感谢你的帮助参数中的冒号运算符,第二行和第三行开头的行字符,第二行的冒号,否则还有三个u在函数callI意识到take不是正确的函数之后,我想要类似listB的函数!!listCAwesome非常感谢。通过您的解释,我实际上理解了这一点。我仍然需要练习第一个解决方案实现的模式匹配。我曾想过使用zip,但我不知道再次感谢yall两人。我总是忘记使用列表理解,在这里,这绝对是最短、可读性更强的方法!感谢Luc。我对Haskell仍然是新手,列表理解是我通常使用的最接近Python的东西,因此通常被他们所吸引我仍然感到困惑:)。