我有两个清单。一个列表包含一些随机数据,其他列表包含需要删除的第一个列表的索引。
例如,让我们考虑两个列表:
let a = [3,4,5,6,6,7,8]
let b = [1,3]
然后,结果输出应为[3,5,6,7,8]
。数字4和6被删除,因为它们分别位于索引位置1和3上。
我是Haskell的新手,因此很难找到解决方案。
更新:以下代码使其正常工作
import Data.List
dele :: Eq a => [a] -> [Int] -> [a]
dele [] _ = []
dele x [] = x
dele x (y:ys) = dele (delete (x !! y) x) ys
我只是想知道,有没有办法通过地图/折叠方式来解决它?
答案 0 :(得分:2)
deleteByIndex :: (Enum a, Eq a, Num a) => [a] -> [b] -> [b]
deleteByIndex r = map snd . filter (\(i, _) -> notElem i r) . zip [0..]
[0..]
生成无限列表[0, 1, 2, 3, ...]
zip
以[(0,x), (1, y), ...]
filter
采用函数a -> Bool
。 lambda检查索引(对的第一个元素)是否在输入列表r
中。
map snd
返回每对邮政列表的第二个元素。
zip
,filter
,map
和notElem
here
答案 1 :(得分:2)
脱离我的头顶:
removeByIndex :: [Integer] -> [a] -> [a]
removeByIndex indices = map snd . filter notInIndices . zip [0..]
where notInIndices (i,_) = i `notElem` indices
答案 2 :(得分:1)
最近使用镜头库的另一个答案
import Control.Lens
>let a = [3,4,5,6,6,7,8]
>let b = [1,3]
>a^..elements (`notElem`b)
[3,5,6,7,8]
(^ ..)是toListOf的中缀,它可用于遍历结构并从其各部分中列出一个列表。元素功能只允许您选择要包含的元素。
其他选项是“遍历”遍历一个遍历,“两者”遍历一个(,),它们与(。)组合在一起,所以遍历。两个遍历[(1,2),(3,4)]例如。
[(1,2),(3,4)] ^ .. traverse.both [1,2,3,4]