Tôi không nghĩ rằng tôi hiểu các loại lớp. Tôi đã đọc ở đâu đó nghĩ rằng các lớp loại là "giao diện" (từ OO) rằng một kiểu thực hiện là sai và gây hiểu nhầm. Vấn đề là, tôi đang gặp vấn đề khi xem chúng là một cái gì đó khác biệt và làm thế nào là sai.
Ví dụ: nếu tôi có một lớp loại (theo cú pháp Haskell)
class Functor f where
fmap :: (a -> b) -> f a -> f b
Nó khác với giao diện [1] như thế nào (theo cú pháp Java)
interface Functor<A> {
<B> Functor<B> fmap(Function<B, A> fn)
}
interface Function<Return, Argument> {
Return apply(Argument arg);
}
Một sự khác biệt có thể tôi có thể nghĩ đến là việc triển khai lớp loại được sử dụng trong một lệnh gọi nhất định không được chỉ định mà được xác định từ môi trường - giả sử, kiểm tra các mô-đun có sẵn để triển khai loại này. Đó dường như là một tạo tác triển khai có thể được xử lý bằng ngôn ngữ OO; như trình biên dịch (hoặc thời gian chạy) có thể quét một trình bao bọc / bộ mở rộng / trình vá khỉ hiển thị giao diện cần thiết trên loại.
Tôi đang thiếu gì?
[1] Lưu ý rằng f a
đối số đã bị xóa từ fmap
khi có ngôn ngữ OO, bạn sẽ gọi phương thức này trên một đối tượng. Giao diện này giả định f a
đối số đã được sửa.