这是我在某处遇到的代码,但想知道它是如何工作的:
findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices _ [] = []
findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))
输出:findIndices(== 0)[1,2,0,3,0] == [2,4],其中pred是(== 0)&xs是[1,2,0,3,0]
我将展示一些理解:
(zip [0..] xs)
上一行所做的是将索引放入列表中的所有内容。对于上面给出的输入,它看起来像这样:[(0,1),(1,2,2,(2,0),(3,3),(4,0)]
(pred . snd)
我发现这意味着像pred(snd(x))。我的问题是,列表是否由邮编组成?我倾向于是,但是我的猜测很脆弱。
接下来,是我对fst和snd的理解。我知道
fst(1,2) = 1
和
snd(1,2) = 2
这两个命令在代码中如何有意义?
我对过滤器的理解是,它返回符合条件的项目列表。例如,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
会给[6,7,8,9,10]
我对map的理解是,它将map应用于列表中的每个项目。例如,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
会给[4,8,12,16,20]
整体如何运作?我想到目前为止,我对自己所了解的内容已经很全面了,但是还不能完全整合。有人可以帮我吗?