如何删除列表中数字的第一个外观?哈斯克尔

时间:2013-06-29 14:13:08

标签: algorithm list haskell

我需要创建一个带有列表和元素的函数,并返回一个列表,其中第一次出现的元素被删除:类似

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

2 个答案:

答案 0 :(得分:12)

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

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

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

另请注意,来自removeFst = flip delete的{​​{1}} delete

答案 1 :(得分:2)

应该提到的是,你的功能相当于Data.List.delete

这是另一个版本:

import Data.List

removeFst xs x = front ++ drop 1 back where 
  (front, back) = break (==x) xs