2011-11-08 36 views
5

Tôi gặp vấn đề trong đó tôi phải thao tác một danh sách danh sách các phao. [[Phao]]. danh sách các phao nổi có chiều dài 4. Tôi muốn loại bỏ các bản sao mà trong đó 3 phần tử đầu tiên được kiểm tra, nhưng bỏ qua phần tử thứ 4. Đây là phần cuối của một vấn đề đa phần và tôi đã đập đầu vào một bức tường trong một lúc để tìm ra cách sử dụng nó. Tôi không thể tìm thấy bất kỳ thông tin hữu ích nào.Có một thời gian khó hiểu cách sử dụng nubBy

fixDuplicates :: [[Float]] -> [[Float]] 
fixDuplcates [[]] = [[]] 
fixDuplicates x = nubBy ? 
+2

Nhận xét chủ đề: Nếu số 4 đặc biệt, có lẽ bạn nên xác minh lại bằng cách nào đó khi xác định kiểu dữ liệu? Loại như thế nào người ta sẽ sử dụng một struct w/tên có ý nghĩa để lưu trữ một bản ghi thay vì sử dụng một mảng các giá trị. – hugomg

+0

các kiểu dữ liệu được xác định trước và tôi phải làm việc với những gì im được cung cấp –

+0

Bạn có thể tạo một hàm chuyển đổi;) – hugomg

Trả lời

10

nubBy có chức năng sử dụng để so sánh các yếu tố bình đẳng. Định nghĩa của bạn về sự bình đẳng là hai danh sách là bình đẳng nếu ba yếu tố đầu tiên của họ phù hợp. Việc triển khai đơn giản này là:

fixDuplicates xs = nubBy firstThreeMatch xs 
    where firstThreeMatch ys zs = take 3 ys == take 3 zs 
+8

Có thể hủy bỏ sự lặp lại và trở thành 'nubBy ((==) \' trên \ 'lấy 3)' với một bổ sung nhập 'Data.Function'. – ephemient

+0

hoàn hảo, cảm ơn bạn rất nhiều, chương trình của tôi hoạt động hoàn hảo ngay bây giờ. –

Các vấn đề liên quan