2013-06-29 14 views
6

muszę zrobić funkcję, która pobiera listę i element i zwraca listę, w której pierwsze wystąpienie elementu jest usuwany: coś jakJak usunąć pierwszą pozycję numeru z listy? Haskell

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

co starałem się:

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 

Ale to nie działa ... zwraca listę bez pierwszych elementów. Myślę, że powinienem zrobić wywołanie rekurencyjne, aby lista coś takiego:

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

Odpowiedz

12

jesteś bardzo blisko, co pominięcia jest poprzedzenie elementy przed pierwszym znaleziono m do listy wynikowej,

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

Należy pamiętać, że specjalny przypadek dla list jednoskładnikowych jest zbędny.

Należy również pamiętać, że removeFst = flip delete z delete z Data.List.

+0

thx :) to działało – Thanatos

2

Należy wspomnieć, że twoja funkcja jest równoważna z Data.List.delete.

Oto inna wersja:

import Data.List 

removeFst xs x = front ++ drop 1 back where 
    (front, back) = break (==x) xs 
Powiązane problemy