【问题标题】:How can I remove the first apperance of a number in a list? Haskell如何删除列表中第一次出现的数字?哈斯克尔
【发布时间】:2013-06-29 14:13:07
【问题描述】:

我需要创建一个函数,它接受一个列表和一个元素并返回一个列表,其中删除了第一次出现的元素:类似于

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

【问题讨论】:

    标签: algorithm list haskell


    【解决方案1】:

    您非常接近,您错过的是在第一个找到 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

    【讨论】:

      【解决方案2】:

      需要说明的是,你的函数相当于Data.List.delete

      这里是另一个版本:

      import Data.List
      
      removeFst xs x = front ++ drop 1 back where 
        (front, back) = break (==x) xs
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多