Lấy cảm hứng từ Comparing list lengthdanh sách So sánh chiều dài với mũi tên
Nếu tôi muốn tìm danh sách dài nhất trong một danh sách liệt kê, cách đơn giản nhất có lẽ là:
longestList :: [[a]] -> [a]
longestList = maximumBy (comparing length)
Một cách hiệu quả hơn sẽ để tính toán trước độ dài:
longest :: [[a]] -> [a]
longest xss = snd $ maximumBy (comparing fst) [(length xs, xs) | xs <- xss]
Bây giờ, tôi muốn tiến thêm một bước nữa. Nó có thể không hiệu quả hơn đối với các trường hợp thông thường, nhưng bạn có thể giải quyết này bằng cách sử dụng các mũi tên không? Ý tưởng của tôi là cơ bản, bước qua tất cả các danh sách cùng một lúc, và tiếp tục bước cho đến khi bạn đã overstepped chiều dài của tất cả các danh sách ngoại trừ dài nhất.
longest [[1],[1],[1..2^1000],[1],[1]]
Trong forgoing (rất giả tạo) Ví dụ, bạn sẽ chỉ phải mất hai bước qua từng danh sách để xác định rằng danh sách [1..2^1000]
là dài nhất, mà không bao giờ cần phải xác định toàn bộ chiều dài của danh sách nói . Tôi có đúng là điều này có thể được thực hiện với các mũi tên không? Nếu có thì làm sao? Nếu không, thì tại sao không, và cách tiếp cận này có thể được thực hiện như thế nào?
Tôi không thấy bất kỳ kết nối nào với mũi tên. – luqui
@luqui một phần của Wikibook Haskell trên [Sử dụng mũi tên] (http://en.wikibooks.org/wiki/Haskell/Understanding_arrows#Using_arrows) dường như nêu rõ rằng các mũi tên hữu ích cho việc phân tích cú pháp theo cách tương tự với của tôi giải pháp đề xuất cho vấn đề này (xem phần tử đầu tiên của mỗi danh sách, sau đó là phần thứ hai, vv) [Hướng dẫn mũi tên của Stephen] (http: //en.wikibooks.org/wiki/Haskell/StephensArrowTutorial) mang đến cho tôi cảm giác giống nhau: các mũi tên đó có thể được sử dụng để tìm hiểu các danh sách này và lưu trữ thông tin khi chúng đi. –
Tôi đã chấp nhận câu trả lời, nhưng nếu ai đó có thể đưa ra câu trả lời bằng mũi tên, hoặc giải thích kỹ lưỡng tại sao mũi tên không thích hợp, thì tôi chắc chắn sẽ chấp nhận câu trả lời đó. –