如何在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
相关产品推荐
相关产品推荐

