2012-10-08 3 views
1

작동하지 포함하는 목록과 나는 다음과 같은 기능이 있습니다하스켈 - 기능 어쩌면

-- xs: list to be changed 
-- ws: list of indices where the values will change to 0 
replaceAtIndices xs ws = [if (fromJust (elemIndex x xs)) `elem` ws then 0 else x | x <- xs] 

기능은이 개 목록에 걸립니다. WS는이, 그리고 다른 사람을 위해 어떤 경우 작동, 나는 몇 가지 이유를 들어 0

로 변경할 XS의 값의 인덱스입니다

*Main> replaceAtIndices [1,2,3,4] [2,3] 

[1,2,0, 0] - 올바른

*Main> replaceAtIndices [1,2,3,4] [2] 

은 [1,2,0,4]

- 올바른이

*Main> replaceAtIndices [1,1,2,1,3] [3] 

[1,1,2,1,3] - 있어야한다 [1,1 , 2,0,3]

누구나 이유를 설명해주세요.

미리 감사드립니다. 항상 3 그래서 아무것도 교체하지됩니다 일치하지 않는 1의 인덱스에 대한 0를 반환하는 세 번째 경우에, 그래서

+0

; '어쩌면'단지 데이터 형식입니다. –

답변

4

elemIndex는 목록에있는 항목의 발생의 인덱스를 반환합니다.

항목과 색인을 연결하는 더 좋은 방법은 zip 사용하는 것입니다 : 문제는 모나드 인터페이스와는 아무 상관이 없기 때문에 내가 제목을 편집

replaceAtIndices xs ws = [if i `elem` ws then 0 else x | (i, x) <- zip [0..] xs] 
+0

감사! 이것은 또한 모나드를 사용하지 않아도됩니다! – user1670032