我正在尝试从列表中删除给出其索引的项目。这是我到目前为止所做的:
count :: Eq a => [a] -> [a] -> [Int]
count s1 s2 = findIndices(`elem` s1) s2
如果这样调用:计数“ FOOOTBALL”“ OREO”它将返回[1,2],因为两个字符串的交集为'O',所以它将返回出现此字符的索引列表,但不会计数多余的“ O”,因为“ OREO”中只有两个“ O”,我只是在解释这个以提供更多背景信息。 所以我现在要做的是获取返回的索引列表,然后从列表中删除索引处出现的每个字符。但是我不知道如何做,因为我刚开始学习Haskell。任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
由于要删除的索引已排序,因此您可以运行该列表,跟踪当前索引,并在索引列表的开头与当前索引匹配时删除元素。如果它们匹配,则丢弃索引列表和元素列表的头部。如果它们不匹配,则发出该元素,并处理列表的其余部分。如果在到达元素列表的末尾之前用完了索引,则只需返回元素列表的其余部分即可。
removeIndices :: [Int] -> [a] -> [a]
removeIndices = go 0 where
go j (i:is) (a:as) | i == j = go (j+1) is as
| otherwise = a : go (j+1) (i:is) as
go _ _ as = as
答案 1 :(得分:1)
使用软件包data-ordlist
的{{3}},
> import qualified Data.List.Ordered as O
> map fst $ O.minusBy (\(_,i) j -> compare i j) (zip "Hello, World!" [1..]) [2,5,9]
"Hll, Wrld!"
如果愿意,比较功能也可以写为(compare . snd)
。