我想在Haskell中创建我自己版本的findIndices



我是Haskell的新手,对语法不太熟悉。我基本上是在尝试从Haskell编写我自己版本的findIndices。这就是我目前所拥有的:

findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices pred [] = []
findIndices pred (x:xs) = [n | n <- [0..length xs], pred x == True]

我被困在列表理解部分。我想能够询问列表中所有元素的pred x==是否为True,但这只会在列表的开头询问它。有没有什么方法可以在整个列表中重复出现,询问pred x==True?

x是列表的第一个元素,xs是其余元素,因此无论n的值如何,pred x都将始终是True或始终是False

您可以使用zip :: [a] -> [b] -> [(a, b)]同时枚举两个以上的列表并构造2元组,因此:

findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices pred xs = [i | (i, x) <- zip [0..] xs, pred x]

这里(i, x)是2元组,其中i是(基于零的(索引,而x是来自xs的元素。因此,我们对pred x进行过滤,并在这种情况下产生索引i

使用zip [0..] xs获取(索引、元素(元组列表,然后应用谓词:(

findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices pred xs = [i | (i, x) <- zip [0..] xs, pred x]