6

Sau hơn một năm cãi nhau tinh thần, cuối cùng tôi đã hiểu Haskell đủ để coi đó là ngôn ngữ chính của tôi cho phần lớn các nhu cầu lập trình chung của tôi. Tôi hoàn toàn thích nó.Chức năng so sánh các tập hợp dữ liệu với nhau một lần với Haskell

Nhưng tôi vẫn đấu tranh với các hoạt động rất cụ thể theo cách chức năng.

Một ví dụ đơn giản:

Set = [("Bob", 10), ("Megan", 7), ("Frank", 2), ("Jane", 11)] 

Tôi muốn so sánh các mục với nhau. Với một ngôn ngữ như C hoặc Python, tôi có thể tạo ra một số vòng lặp phức tạp, nhưng tôi không chắc chắn cách tiếp cận nào (bản đồ, gấp, danh sách hiểu?) Sẽ là tốt nhất hoặc hiệu quả nhất với ngôn ngữ chức năng.

Dưới đây là một mẫu mã tôi bắt đầu làm việc trên:

run xs = [ someAlgorithm (snd x) (snd y) | x <- xs, y <- xs, x /= y ] 

Các vị giữ sự hiểu biết danh sách từ so sánh mục với chính mình, nhưng chức năng không phải là rất hiệu quả vì nó so sánh mục mà đã được so. Ví dụ. Nó sẽ so sánh Bob với Megan, và sau đó so sánh Megan với Bob.

Bất kỳ lời khuyên nào về cách giải quyết vấn đề này sẽ được đánh giá cao.

+0

Bạn nói rằng bạn muốn so sánh chúng, nhưng không phải những gì bạn muốn làm với kết quả so sánh. Từ mẫu của bạn có vẻ như bạn muốn xem xét mọi lựa chọn của hai yếu tố khác nhau từ một danh sách. Là nó? –

+0

Có, nhưng không phải là lựa chọn "đảo ngược". Tôi muốn so sánh Bob với Megan, Bob với Frank, Bob cùng với Jane, và sau đó là Megan cùng Frank, Megan cùng Jane, và sau đó Frank cùng Jane (tôi nghĩ rằng bao gồm tất cả các kết hợp). Điều này trông giống như một cái gì đó mà có thể được thực hiện với gấp, nhưng tôi không chắc chắn. –

Trả lời

8

Nếu bạn đặt hàng trên loại dữ liệu, bạn chỉ có thể sử dụng x < y thay vì x /= y.

phương pháp khác là sử dụng tails để tránh so sánh các yếu tố trong vị trí tương đương:

[ ... | (x:ys) <- tails xs, y <- ys] 

này có hiệu lực thi hành của các mặt hàng chỉ chọn y xảy ra sau x trong danh sách ban đầu. Nếu danh sách của bạn chứa các bản sao, bạn sẽ muốn kết hợp tính năng này với bộ lọc rõ ràng từ trước.

+0

OP dường như muốn xem xét tất cả các cặp, bỏ qua thứ tự, vì vậy tôi không nghĩ rằng sắp xếp giúp - có vẻ như đó là một vấn đề nhất định n ** 2. 1 cho các đề xuất đuôi mặc dù, mà tôi nghĩ là câu trả lời đúng. –

+0

@JameySharp: Vâng, tôi đã có một chút rắm não trên cái đó. Đã xóa phần đó :) – hammar

+0

Giải pháp ngắn gọn như vậy! Cảm ơn bạn rất nhiều vì đã dành thời gian và giúp đỡ. –

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