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
它是这样工作的:
mapAtOriginal (*2) [0,3] [1,2,3,4] -- == [2,2,3,8]
所以我想重写它但使用一个map
函数。我知道这map
适用于列表的每个元素,但是,我只需要将它应用于特定的索引。
我该怎么做?
解决方案
map
不知道“在列表中的哪个位置”。因此,您首先需要将该信息编码到元素本身中。这可以用 来完成zip [0..]
,它基本上用它出现的位置来注释每个元素。
然后,在函数 youmap
中,您只需要对注解元组进行模式匹配,并使用 anif
来决定是否将操纵器函数应用于其他元组元素。
请注意, 和 的组合zip
始终map
等同于单次 pass zipWith
,因此您最好使用它。
推荐阅读
- django - Heroku:部署 Django Rest 框架 + Vue
- android - 我应该为每个 http 连接使用一个加载器还是一个加载器就足够了?
- javascript - 如何为jsGrid中的每一行绑定动态选择选项?
- c# - 在 DataGridView 中显示 BindingList<(int, int, int)>
- cmake - CMake 在生成阶段只生成一个文件
- python - 无法在 matplotlib 中保存带注释的图像
- javascript - 使用 EvaluateJavaScript 单击按钮的意外行为
- sdk - 下载 FairPlay 流媒体服务器 SDK
- python - 从交互式 matplotlib 图中获取数据
- python - 如何将自定义选项传递给 fab 命令