2012-01-14 8 views
5

Trong GHCI, tôi gõ như sau:Haskell Newbie: Không dụ cho Show vào chức năng bản đồ

map (+1) [1..10] 

trả về [2,3,4,5,6,7,8,9,10, 11]

Cho đến nay rất tốt.

Bây giờ tôi gõ:

min (map (+1) [1..10]) 

và tôi nhận được thông báo lỗi sau:

No instance for (Show ([b0] -> [b0])) 
    arising from a use of `print' 
Possible fix: add an instance declaration for (Show ([b0] -> [b0])) 
In a stmt of an interactive GHCi command: print it 

này là rất xa lạ với tôi. Tại sao Haskell nghĩ rằng tôi đang cố in bất kỳ đối số nào và làm cách nào để khắc phục điều này?

Trả lời

12

Vấn đề là min có hai đối số (và trả về tối thiểu hai đối số), nhưng bạn đã chỉ định một đối số; bạn muốn minimum, phiên bản hoạt động trên danh sách.

Cụ thể, lỗi này xảy ra vì GHCi cố gắng in kết quả của các biểu thức bạn đánh giá, nhưng trong trường hợp này, bạn đã áp dụng min cho một đối số, tạo ra một hàm khác. GHCi dutifully cố gắng để in này ra, nhưng nó không thành công, bởi vì chức năng không phải là một thể hiện của Show, loại tiêu chuẩn lớp cho những thứ có thể được đại diện như chuỗi để hiển thị.

Trong Haskell, tất cả các hàm lấy một đối số và hàm của nhiều đối số được tạo từ các hàm trả về các hàm khác; ví dụ, một hàm bổ sung hai số nguyên có thể có loại Integer -> Integer -> Integer, là Integer -> (Integer -> Integer) - một hàm lấy một số nguyên và trả về một hàm khác mà chính nó lấy một số nguyên và trả về một số nguyên. Rất may, bạn không phải suy nghĩ về điều này trong những thuật ngữ rõ ràng như vậy thường xuyên, hoặc nó sẽ rất khó hiểu!

+0

Cảm ơn! Vì lý do nào đó, tôi nghĩ, min, như tổng hợp hoặc sản phẩm được vận hành trên một danh sách. tối thiểu! – Bylextor

+0

@Bylextor: Bạn được chào đón! Nếu câu trả lời của tôi đã giúp bạn, bạn nên nhấp vào dấu tích bên cạnh nó để giúp những người khác trong tương lai :) – ehird

+0

Xong. Đó là một lời giải thích tuyệt vời! – Bylextor