根据元素索引修改列表的元素

use*_*287 2 indexing dictionary haskell list

使用Haskell:

假设我有列表:[1,3,4,2,3] 我想修改列表中的所有3个.我知道在这种情况下我可以应用它来选择3:

map (\x -> if p x then f x else x) xs 
Run Code Online (Sandbox Code Playgroud)

但是,应用于三元组的函数取决于它们在列表中的索引.

因此,例如,如果索引被添加到所需的数字,我要去的函数的输出将是:[1,4,4,2,7].

Wil*_*sem 7

你可以使用zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]这个:

zipWith (\i x -> if p x then f i x else x) [0..] xs
Run Code Online (Sandbox Code Playgroud)

其中f因此需要i(索引)和x(元素)都考虑在内.

例如:

zipWith (\i x -> if x == 3 then (i+x) else x) [0..] xs
Run Code Online (Sandbox Code Playgroud)

这会产生所需的输出:

Prelude> let xs = [1,3,4,2,3]
Prelude> zipWith (\i x -> if x == 3 then (i+x) else x) [0..] xs
[1,4,4,2,7]
Run Code Online (Sandbox Code Playgroud)

您可以将此逻辑封装到单独的函数中,例如imap :: (Enum n, Num n) => (n -> a -> b) -> [a] -> b:

imap :: (Enum n, Num n) => (n -> a -> b) -> [a] -> b
imap = flip zipWith [0..]
Run Code Online (Sandbox Code Playgroud)

这将与任何类型的实例工作NumEnum(所以Integer,Int,Float,...).