2013-06-29 35 views
6

tôi cần phải thực hiện một chức năng mà phải mất một danh sách và một yếu tố và trả về một danh sách trong đó sự xuất hiện đầu tiên của nguyên tố này được lấy ra: một cái gì đó giống nhưLàm cách nào tôi có thể xóa lần xuất hiện đầu tiên của một số trong danh sách? Haskell

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

Những gì tôi cố gắng là:

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 

Nhưng điều này không hoạt động ... nó trả về danh sách mà không có các phần tử đầu tiên. Tôi nghĩ rằng tôi nên thực hiện cuộc gọi đệ quy để làm cho danh sách cái gì đó như:

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

Trả lời

12

Bạn đang rất gần, những gì bạn bỏ lỡ được thêm vào trước các yếu tố trước khi là người đầu tiên tìm thấy m vào danh sách kết quả,

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

Lưu ý rằng trường hợp đặc biệt cho danh sách một phần tử là không cần thiết.

Cũng lưu ý rằng removeFst = flip delete với delete từ Data.List.

+0

thx :) nó làm việc – Thanatos

2

Cần lưu ý rằng chức năng của bạn tương đương với Data.List.delete.

đây một phiên bản khác:

import Data.List 

removeFst xs x = front ++ drop 1 back where 
    (front, back) = break (==x) xs 
Các vấn đề liên quan