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]

该函数接受 2 个列表。ws 是 xs 中我想更改为 0 的值的索引。

出于某种原因,它适用于某些情况,而不适用于其他情况:

*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]

谁能解释这是为什么?

提前致谢!

4

1 回答 1

4

elemIndex返回列表中第一次出现的项目的索引,因此在第三种情况下,它总是返回不匹配0的索引,因此没有任何内容被替换。13

将索引与项目关联的更好方法是使用zip

replaceAtIndices xs ws = [if i `elem` ws then 0 else x | (i, x) <- zip [0..] xs]
于 2012-10-09T00:03:42.527 回答