Tôi đang học Haskell từ một thời gian ngắn, vì vậy tôi là một người mới.Các cuộc gọi đa hình Haskell không có kiến thức kiểu hoàn chỉnh
Các mã sau đây là rất dễ hiểu:
purStrLn $ show [1]
Ở đây chúng ta có thể suy ra tất cả các loại (với giá trị mặc định), và tất cả hoạt động tốt. Nhưng mã sau cũng hoạt động:
putStrLn $ show []
ngay cả khi chúng tôi không thể suy ra loại danh sách.
Nếu tôi thực thi mã với ghci tôi có được những điều sau:
Prelude> []
[]
Prelude> :t it
it :: [a]
Prelude>
nên loại có vẻ là đa hình. Nhưng trong trường hợp này, chương trình sẽ được gọi với một kiểu được áp dụng một phần.
Hành vi tương tự cũng phổ biến với các loại khác, ví dụ với Data.Map.empty, do đó, nó không phải là một tính năng danh sách (hoặc ít nhất nó có vẻ như nó).
Tại sao và cách thức hoạt động?
'purStrLn $ chương trình [1] 'vẫn phải mặc một loại, như '[1] :: (Num n) => [n]' – amindfv
Đó là sự thật, nhưng có mặc định trong trường hợp như thế này. – Totoro
Lưu ý rằng điều gì đó khác xảy ra khi biến loại không bị giới hạn như trong ví dụ: 'length []', xem: http://stackoverflow.com/q/7076517. – hammar