映射功能应用于列表的特定元素

oso*_*nyj 1 recursion haskell function map-function

我有一个功能:

mapAtOriginal :: (a -> a) -> [Int] -> [a] -> [a]
mapAtOriginal f is xs = helper 0 is xs
  where
    helper _ [] xs = xs
    helper c (i:is) (x:xs)
      | c < i     =   x : helper (c+1) (i:is) xs
      | otherwise = f x : helper (c+1)    is  xs
Run Code Online (Sandbox Code Playgroud)

它是这样的:

mapAtOriginal (*2) [0,3] [1,2,3,4]   -- == [2,2,3,8]
Run Code Online (Sandbox Code Playgroud)

因此,我想使用map功能重写它。我知道这map适用于列表的每个元素,但是,我只需要将其应用于特定的索引。

我该怎么做?

lef*_*out 5

map不知道它在“列表中的位置”。因此,您首先需要将该信息编码为元素本身。可以使用来完成此操作zip [0..],基本上可以用每个元素的出现位置注释每个元素。

然后,在函数you中map,您只需要在注释元组上进行模式匹配,并使用an if来决定是否将操纵器函数应用于其他元组元素。

请注意,组合zipmap总是等同于单次zipWith,所以这就是你应该preferrably使用。

  • 或使用列表理解,`[foo x | (i,x)&lt;-zip [0 ..] xs,elem i是]`。这引起了人们的关注,因为它不一定是二次的,所以问题就变成了如何使其线性(在索引中)。一种方法是使用[有状态的文件夹](/sf/answers/4135271661/),将索引作为状态。 (2认同)