이것은 내가 어딘가에 왔지만 이것이 어떻게 작동하는지 알고 싶어하는 코드입니다.
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
이 두 명령은 코드에서 어떻게 의미가 있습니까?
필터에 대한 이해는 조건과 일치하는 항목 목록을 반환한다는 것입니다. 예를 들어
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]
전체적으로 어떻게 작동합니까? 나는 지금까지 내가 아는 것에 포괄적 이었지만 조각을 합칠 수는 없다고 생각합니다. 아무도 나를 도울 수 있습니까?