从给定出现项目的索引列表的列表中删除项目-Haskell

时间:2019-11-21 16:37:30

标签: haskell

我正在尝试从列表中删除给出其索引的项目。这是我到目前为止所做的:

count   :: Eq a => [a] -> [a] -> [Int]
count s1 s2 = findIndices(`elem` s1) s2

如果这样调用:计数“ FOOOTBALL”“ OREO”它将返回[1,2],因为两个字符串的交集为'O',所以它将返回出现此字符的索引列表,但不会计数多余的“ O”,因为“ OREO”中只有两个“ O”,我只是在解释这个以提供更多背景信息。 所以我现在要做的是获取返回的索引列表,然后从列表中删除索引处出现的每个字符。但是我不知道如何做,因为我刚开始学习Haskell。任何帮助将不胜感激,谢谢!

2 个答案:

答案 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)