Nghe có vẻ ngớ ngẩn, nhưng tôi không hiểu. Tại sao biểu thức [] == [] lại được gõ? Cụ thể hơn, loại nào (trong lớp Eq) được suy ra cho loại phần tử danh sách?Làm thế nào là loại `([] ==) []` haskell suy luận?
Trong một phiên ghci, tôi thấy như sau:
Prelude> :t (==[])
(==[]) :: (Eq [a]) => [a] -> Bool
Nhưng hạn chế Eq [a]
ngụ ý Eq a
cũng có, như được hiển thị ở đây:
Prelude> (==[]) ([]::[IO()])
<interactive>:1:1:
No instance for (Eq (IO()))
arising from use of `==' at <interactive>:1:1-2
Probable fix: add an instance declaration for (Eq (IO()))
In the definition of `it': it = (== []) ([] :: [IO()])
Như vậy, trong [] == [] , trình kiểm tra kiểu phải giả định rằng phần tử danh sách là một kiểu nào đó có trong lớp Eq. Nhưng cái nào? Kiểu [] chỉ là [a], và điều này chắc chắn là tổng quát hơn Eq a => [a].
IMHO này nên bởi mơ hồ, ít nhất là trong Haskell 98 (đó là những gì chúng ta đang nói về)
Với GHC (không GHCi) Tôi đã có 'Biến loại mơ hồ \' a 'trong ràng buộc \ 'Eq a 'phát sinh từ việc sử dụng \' ==' ' – kennytm
@Kenny - có thats những gì tôi mong đợi trước khi tôi thử trong ghci - sự ngạc nhiên của tôi càng lớn. Cảm ơn gợi ý, bây giờ trật tự thế giới của tôi được khôi phục :) – Ingo
Đó là những cái ôm thú vị cho biểu thức '[] == []' loại 'Eq a => Bool'. – sdcvvc