Đây là sửa chữa tối thiểu để làm ví dụ công việc của bạn:
removeItem :: Int -> [Int] -> [Int]
removeItem _ [] = []
removeItem x (y:ys) = areTheySame x y ++ removeItem x ys
Trước tiên, bạn cần phải sử dụng ++
để nối danh sách, như các nhà điều hành :
sử dụng bởi bạn cho biết thêm chỉ là một yếu tố để khởi đầu của một danh sách (nó không thể được sử dụng để thêm danh sách với một phần tử cũng như không thêm danh sách trống). Trước tiên, bạn so sánh đầu danh sách (y
) với mục bạn muốn xóa và trả lại chính xác mục hoặc danh sách trống bằng cách sử dụng areTheySame
. Sau đó, bạn muốn đệ quy tiếp tục sử dụng removeItem
trên phần còn lại của danh sách (ys
). Danh sách kết quả cần được ghép nối bằng cách sử dụng ++
.
Thứ hai, như Chris Lutz đã lưu ý, bạn cần điều kiện kết thúc khi bạn đến cuối danh sách. Bằng cách thêm dòng này, Haskell biết phải làm gì với một danh sách trống (có nghĩa là, không có gì, chỉ cần trả về một danh sách trống). Như Chuck đã nói, bạn có thể đơn giản hóa mã cho nhiệm vụ này bằng cách removeItem không ủy nhiệm nhiệm vụ so sánh, nhưng so sánh chính nó và vứt bỏ phần tử nếu nó bị xóa, nếu không hãy giữ nó ở đầu danh sách (sử dụng :
). Trong mọi trường hợp, tiếp tục đệ quy với phần còn lại của danh sách.
-- nothing can be removed from an empty list
-- ==> return empty list and stop recursion
removeItem _ [] = []
-- if the list is not empty, cut off the head in y and keep the rest in ys
-- if x==y, remove y and continue
removeItem x (y:ys) | x == y = removeItem x ys
-- otherwise, add y back and continue
| otherwise = y : removeItem x ys
Cũng giống như một mẹo, nứt mở báo cáo Haskell 98 và đọc mã được cung cấp cho các chức năng Prelude là một mắt mở thực sự. Bạn sẽ học được rất nhiều điều về cách mọi thứ hoạt động (và học được rất nhiều thứ về những điều bạn không nên bận tâm, ngoại trừ một bài tập học trí tuệ!). Đây là chuyến tham quan phong nha của nó: http://ww2.cs.mu.oz.au/172/Haskell/tourofprelude.html. http://members.chello.nl/hjgtuyl/tourdemonad.html và http://cs.anu.edu.au/student/comp1100/haskell/tourofsyntax.html cũng hữu ích. (Đáng buồn haskell.org vẫn còn xuống vì vậy tôi không thể kết nối bạn trực tiếp với báo cáo.) –