这是我在某处找到的代码,但我想知道它是如何工作的:
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,0),(3,3),(4,0)]
。
以上代码的作用是为列表中的每个元素添加索引。对于给定的输入,它看起来像这样:[(0,1),(1,2),(2,0),(3,3),(4,0)]
。
(pred . snd)
我发现这意味着类似于 pred (snd (x))
。我的问题是,x
是否是由 zip
行生成的列表?我倾向于是,但我的猜测不确定。
接下来,关于 fst
和 snd
的理解。我知道
fst(1,2) = 1
snd(1,2) = 2
这两个命令在代码中有什么意义? 我对filter
的理解是它返回与条件匹配的项目列表。例如, listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
将会给出[6,7,8,9,10]
我对map的理解是它将函数应用于列表中的每个项。例如,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
将给出[4, 8, 12, 16, 20]
总体上这是如何工作的?我认为目前我所知道的已经非常全面了,但是还不能完全将它们串联起来。有人能帮帮我吗?