Haskell如何使用init函数移除列表中指定值的最后一次出现
使用init函数移除列表指定值最后一次出现的Haskell实现
核心思路
要使用init完成需求,核心逻辑如下:
- 先定位目标值在列表中最后一次出现的索引
- 截取从列表开头到该索引的前缀,用
init去掉前缀的最后一个元素(也就是要移除的目标值) - 将处理后的前缀和该索引之后的后缀拼接,得到最终结果
完整代码
你之前的代码第一个模式匹配存在参数匹配错误,修正后的完整实现如下:
removeLast::(Eq a) => a -> [a] -> [a] -- 空列表直接返回 removeLast _ [] = [] removeLast v xs = -- 提取所有匹配目标值的索引 let matchPos = [i | (i, val) <- zip [0..] xs, val == v] in if null matchPos -- 无匹配值返回原列表 then xs -- 取最后一次匹配的索引处理 else let lastIdx = last matchPos in init (take (lastIdx + 1) xs) ++ drop (lastIdx + 1) xs
代码说明
- 这里
init的作用是移除截取的前缀的最后一个元素,也就是我们要删除的最后一次出现的目标值,完全符合使用init的要求 - 兼容无匹配值、目标值出现在列表头尾等所有边界场景
测试示例
removeLast 2 [1,3,2,4,2,5]输出[1,3,2,4,5]removeLast 'a' "abac"输出"abc"removeLast 6 [1,2,3]输出[1,2,3]
内容的提问来源于stack exchange,提问作者Chris Evans
相关产品推荐
相关产品推荐

