2013-06-29 44 views
6

我需要做一個函數,它接受一個列表和一個元素,並返回該元素的第一次出現被刪除列表:像如何刪除列表中第一個數字的外觀?哈斯克爾

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 

回答

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 deletedeleteData.List

+0

THX :)它的工作 – Thanatos

2

應該提到的是,你的功能相當於Data.List.delete

這裏的另一個版本:

import Data.List 

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