首页 > 解决方案 > 映射函数应用于列表的特定元素

问题描述

我有一个功能:

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

它是这样工作的:

mapAtOriginal (*2) [0,3] [1,2,3,4]   -- == [2,2,3,8]

所以我想重写它但使用一个map函数。我知道这map适用于列表的每个元素,但是,我只需要将它应用于特定的索引。

我该怎么做?

标签: functionhaskellrecursionmap-function

解决方案


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

然后,在函数 youmap中,您只需要对注解元组进行模式匹配,并使用 anif来决定是否将操纵器函数应用于其他元组元素。

请注意, 和 的组合zip始终map等同于单次 pass zipWith,因此您最好使用它。


推荐阅读