Tôi cố gắng để tìm ra danh sách với tổng nhỏ nhất của các yếu tố .:Tại sao tôi nhận được lỗi Không thể suy luận (Ord a)?
shortest :: (Num a) => [[a]] -> [a]
shortest [] = []
shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs
Điều đó mang lại cho tôi những lỗi sau:
Could not deduce (Ord a) arising from a use of `<' from the context (Eq a) bound by the type signature for shortest :: Eq a => [[a]] -> [a] at code.hs:(8,1)-(9,71) Possible fix: add (Ord a) to the context of the type signature for shortest :: Eq a => [[a]] -> [a] In the expression: sum x < sum (shortest xs) In the expression: if sum x < sum (shortest xs) then x else shortest xs In an equation for `shortest': shortest (x : xs) = if sum x < sum (shortest xs) then x else shortest xs
Tại sao không phải là chức năng typecheck?
'ngắn nhất' không thực sự là tên phù hợp cho điều này, phải không? - Xem xét sử dụng 'minimumBy (so sánh \' trên \ 'tổng hợp)', với các hàm bậc cao hơn từ 'Data.List' và' Data.Function'. – leftaroundabout
Để hiểu vấn đề này, điều quan trọng là phải biết rằng không phải tất cả các số đều có thể được đặt hàng. Ví dụ, hãy xem xét các số phức như '1 + 2i'; không có cách nào để sắp xếp chúng. – dflemstr
@leftaroundabout đã đề xuất giải pháp sử dụng chức năng thư viện; nhưng nếu bạn vẫn muốn viết nó từ đầu như một bài tập, ngoài việc sửa chữa vấn đề chữ ký, bạn cần xem xét giá trị của 'shortest []' hay nói cách khác, cơ sở của đệ quy là gì gợi ý: 'tối thiểu' và' tối đa' thường không được xác định cho danh sách trống). –