Đối với các định nghĩa hàm thông thường sau:Sự khác nhau giữa hai định nghĩa kiểu hàm này là gì?
printLength1::(Num a)=>String->a
printLength1 s = length s
printLength2::String->Int
printLength2 s = length s
Tại sao họ lại không giống nhau? Trong tình huống nào tôi nên chọn cái này qua cái kia?
Và tôi nhận được lỗi này cho printLength1:
Couldn't match type `a' with `Int'
`a' is a rigid type variable bound by
the type signature for rpnc :: String -> a at test.hs:20:1
In the return type of a call of `length'
In the expression: length s
In an equation for `rpnc': rpnc s = length s
Tôi hiểu lỗi này. Nhưng làm thế nào tôi có thể sửa lỗi này? Tôi đã đọc một số bài đăng ở đây về biến loại cứng nhắc nhưng vẫn không thể hiểu cách khắc phục.
Xin cảm ơn các bạn. Tôi hy vọng không còn những ẩn số như vậy trong ngôn ngữ. – osager
@osager Đây không phải là một điều kỳ quặc, đây là một phần cơ bản quan trọng của hệ thống kiểu. Các loại đa hình (ít nhất là loại đa hình bậc 1) được biến thành các loại bê tông theo cách chúng được sử dụng. Nếu bạn viết một chữ ký kiểu xác nhận rằng một loại là đa hình, nó cần phải thực sự * là * đa hình. – Carl
Lớp 'Num' không phải là một quirk, nhưng bạn có thể lý luận cho rằng' length' là một 'Int' chứ không phải là một' Num a' là một quirk. –