2017-10-28 21 views
6

Tôi mới bắt đầu học Haskell. Tôi đang cố gắng tìm một x trong danh sách mà score x có giá trị tối đa. Tôi đã thử snd (maximum [(score x, x) | x <- codes]) hoạt động, nhưng tôi đã tự hỏi liệu có cách nào nhanh hơn để thực hiện điều này, mà không thực sự lưu trữ cả hàm và giá trị.Haskell: x trong danh sách mà f (x) là tối đa

Cảm ơn mọi đề xuất!

+2

Đừng lo lắng về điểm số được "lưu trữ" - cách thức hoạt động của Haskell và GHC, chúng sẽ không hoạt động. Ví dụ, chương trình biên dịch 'main = print (tối đa [(2 * x, x) | x <- [1..100000000000] :: [Int]])' có thể mất khoảng 10-15 phút để chạy nhưng sẽ làm do đó, trong bộ nhớ nhỏ, liên tục, vì trình biên dịch sẽ xác định rằng cả các mã cũng như điểm số cần phải được giữ lại để có được câu trả lời. –

+1

Lưu ý rằng nếu bất kỳ mã nào có cùng số điểm, điều này sẽ chọn giữa chúng bằng cách chọn mã tối đa, tuy nhiên 'Ord' được xác định cho loại đó. Điều này có thể hoặc không thể là những gì bạn muốn. – Carl

+0

'snd. maximumBy (so sánh fst). map (score &&& id) 'cũng hoạt động cho các kiểu không phải' '' '' –

Trả lời

7

Giải pháp của bạn là tốt. Nếu bạn muốn giúp đỡ một số thư viện, bạn có thể sử dụng

maximumBy (comparing score) codes 

Lưu ý rằng điều này, so với mã của bạn, sẽ thực hiện nhiều cuộc gọi đến score. Nếu score là tốn kém để tính toán, cách tiếp cận của bạn là tốt hơn vì nó sẽ tính toán score chỉ một lần cho mỗi phần tử danh sách.

+0

TIL của 'so sánh' - cảm ơn bạn rất nhiều! – AJFarmar

+0

@AJFarmar Trước khi nó được giới thiệu, thành ngữ là '' so sánh 'trên' điểm số''. Điều này quá phổ biến đến nỗi 'so sánh = trên so sánh' cuối cùng đã được thêm vào các thư viện. – chi

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