我是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]