2013-03-19 23 views
16

Vì vậy, tôi có một chức năng rất đơn giản mà có hai tham số: đầu tiên là một giờ (giữa 0 và 23) và thứ hai là một phút (từ 0 đến 59). Hàm này trả về giờ cộng một phút và định dạng giờ theo kiểu đẹp. Ví dụ: hour 11 12 trả lại 11 heures et 13 minutes. Xin lỗi cho định dạng tiếng Pháp của giờ.Tại sao thêm ràng buộc loại "Eq" mà không sử dụng "=="?

Vì vậy, tôi sử dụng chức năng này show và thông số cần phải là số, vì vậy tôi có khai báo loại (Num a, Show a) => a -> a -> String. Nhưng, khi tôi thử chức năng, tôi gặp lỗi và GHC nói với tôi để thêm ràng buộc loại Eq, nhưng tôi không hiểu tại sao tôi cần ràng buộc loại Eq trong trường hợp này. Có mã (một lần nữa, xin lỗi cho các văn bản tiếng Pháp được sử dụng trong chức năng, nhưng tôi nghĩ rằng nó không phải là rất quan trọng nếu bạn không hiểu tên hàm và các văn bản):

heure :: (Num a, Eq a, Show a) => a -> a -> String 
heure 23 59 = "Minuit" 
heure 12 m = "Midi et " ++ show (m+1) ++ " minutes" 
heure h 59 = show (h+1) ++ " heures" 
heure h m = show h ++ " heures et " ++ show (m+1) ++ " minutes" 

Vì vậy: nếu tôi không sử dụng Eq, tôi gặp lỗi và khi tôi sử dụng mã của tôi là chính xác. Tại sao?

Cảm ơn bạn đã giải thích!

+8

Kết hợp mẫu số, ký tự hoặc chuỗi chữ k với giá trị v thành công nếu v == k, trong đó == bị quá tải dựa trên loại mẫu. Xem [Báo cáo ngôn ngữ Haskell 2010 3.17.2 Ngữ nghĩa không chính thức về khớp mẫu] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17) – nymk

+2

@nymk: [Phần 6.4 của Báo cáo năm 2010] (http://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1350006.4) nói rằng "[t] he class' Num' của các kiểu số là một phân lớp của 'Eq', vì tất cả các số có thể được so sánh cho sự bình đẳng. " Nhưng những gì đang xảy ra ở đây là [các phiên bản gần đây của GHC không làm điều đó] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/release-7-4-1.html): "Lớp' Num' không còn có lớp 'Eq' hoặc' Show'. Vì vậy, một số lớp và hàm khác đã nhận được ràng buộc 'Eq' hoặc' Show', thay vì dựa vào ràng buộc 'Num' cung cấp cho họ." –

Trả lời

22

Bạn cần Eq hạn chế bởi vì bạn đang kiểm tra xem h bằng 23 hoặc 12 và liệu m bằng 59. Bạn đang thực hiện việc đó bằng cách sử dụng đối sánh mẫu, chứ không phải ==, nhưng đối sánh mẫu với các chữ số theo cách đó vẫn yêu cầu Eq (không giống như so khớp mẫu với các hàm tạo).

+1

O.K. Tôi hiểu, cảm ơn lời giải thích của bạn! – vildric

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