我需要制作一个函数,该函数接受一个列表和一个元素,然后返回一个列表,其中删除了第一次出现的元素:

removeFst [1,5,2,3,5,3,4,5,6] 5
[1,2,3,5,3,4,5,6]

我试过的是:
main :: IO()
main = do
    putStr ( show $ removeFst [1,5,2,3,5,3,4,5,6] 5)

removeFst :: [Int] -> Int -> [Int]
removeFst [] m = []
removeFst [x] m
    | x == m     = []
    | otherwise  = [x]
removeFst (x:xs) m
    | x == m     = xs
    | otherwise  = removeFst xs m

但这是行不通的……它返回没有第一个元素的列表。我认为我应该进行递归调用以使列表类似:
removeFst (x:xs) m
    | x == m     = xs
    | otherwise  = removeFst (-- return the whole list till element x) m

最佳答案

您非常接近,您错过的是在第一个找到的m之前将元素放在结果列表中,

removeFst :: [Int] -> Int -> [Int]
removeFst [] m = []
removeFst (x:xs) m
    | x == m     = xs
    | otherwise  = x : removeFst xs m
    --            ^^^ keep x /= m

请注意,单元素列表的特殊情况是多余的。

另请注意,removeFst = flip deletedelete来自Data.List

关于algorithm - 如何删除列表中数字的首次出现? haskell ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17381090/

10-11 03:02