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は、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]である必要があります

誰かがこれがなぜであるか説明できますか?

前もって感謝します!

4

1 に答える 1

4

elemIndexリスト内で最初に出現するアイテムのインデックスを返します。したがって、3番目のケースで0は、インデックスが1一致しないものを常に返すため、3何も置き換えられません。

インデックスをアイテムに関連付けるためのより良い方法は、以下を使用することzipです。

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