これは私がどこかで見つけたコードですが、これがどのように機能するか知りたいです:
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)]
。
(pred . snd)
これはのようなものであることがわかりましたpred (snd (x))
。私の質問は、x
リストはzip
行から作成されていますか?私はイエスに傾いていますが、私の推測は薄っぺらです。
次は、私の理解であるfst
とsnd
。そんなこと知ってる
fst(1,2) = 1
そして
snd(1,2) = 2
これらの2つのコマンドはコードでどのように意味がありますか?
私の理解でfilter
は、条件に一致するアイテムのリストを返します。例えば、
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
与えるだろう [6,7,8,9,10]
マップについての私の理解は、リスト上のすべてのアイテムに関数を適用することです。例えば、
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
与えるだろう [4,8,12,16,20]
これは全体的にどのように機能しますか?私はこれまで私が知っていることで包括的であると思いますが、それらを完全にまとめることはできません。誰かが私を手伝ってくれる?