You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elm中移除列表中指定元素的首次出现?

移除列表中指定元素的首次出现

假设我有一个字符列表:

letters = ['B','A', 'M', 'B', 'A']

我需要一个函数来移除给定字符的首次出现,例如调用:

removeSingleItem letters 'A'
-- 输出: ['B','M', 'B', 'A']

我自己用递归实现了这个函数:

removeSingleItem list item new =
    case list of
        [] -> new
        (x::xs) -> 
            if x == item then
                new ++ xs
             else 
                removeSingleItem xs item (new ++ [x])

但我觉得这个实现太繁琐,而用List.filter会移除所有匹配项,达不到需求。想问有没有用核心List操作的更简便实现方式?


当然有,可以借助break这个核心列表操作来实现,比递归简洁太多:

removeSingleItem :: Eq a => [a] -> a -> [a]
removeSingleItem lst item =
    let (prefix, suffix) = break (== item) lst
    in prefix ++ drop 1 suffix

逻辑说明

  • break (== item) lst 会把原列表拆成两部分:prefix是第一个匹配元素之前的所有元素,suffix是从第一个匹配元素开始到末尾的剩余列表
  • 如果列表里根本没有要移除的元素,suffix就是空列表,drop 1 suffix还是空,最终返回原列表,符合预期
  • 如果存在匹配元素,drop 1 suffix会去掉开头的那个目标元素,再和prefix拼接就得到了移除首次出现后的结果

用你的测试案例验证:

removeSingleItem ['B','A','M','B','A'] 'A'
-- 输出: ['B','M','B','A']

完全满足需求,而且代码简洁易读,全程只用了Haskell核心的列表操作。

内容的提问来源于stack exchange,提问作者spinners

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:30:48