2013-06-29 8 views
6

ho bisogno di fare una funzione che prende una lista e un elemento e restituisce un elenco in cui viene rimossa la prima occorrenza dell'elemento: qualcosa di simileCome posso rimuovere la prima comparsa di un numero in una lista? Haskell

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

Quello che ho cercato è:

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 

Ma questo non funziona ... restituisce la lista senza i primi elementi. Penso che dovrei fare la chiamata ricorsiva a fare l'elenco qualcosa come:

removeFst (x:xs) m 
    | x == m  = xs 
    | otherwise = removeFst (-- return the whole list till element x) m 

risposta

12

Vi sono molto vicino, quello che manca è anteponendo gli elementi prima del primo trovato m alla lista dei risultati,

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

Si noti che il caso speciale per gli elenchi di un elemento è superfluo.

Si noti inoltre che removeFst = flip delete con delete da Data.List.

+0

thx :) ha funzionato – Thanatos

2

È necessario ricordare che la funzione è equivalente a Data.List.delete.

Ecco un'altra versione:

import Data.List 

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