Saya rasa saya tidak mengerti kelas tipe. Saya pernah membaca di suatu tempat bahwa memikirkan kelas tipe sebagai "antarmuka" (dari OO) yang mengimplementasikan tipe adalah salah dan menyesatkan. Masalahnya adalah, saya mengalami masalah melihat mereka sebagai sesuatu yang berbeda dan bagaimana itu salah.
Misalnya, jika saya memiliki kelas tipe (dalam sintaks Haskell)
class Functor f where
fmap :: (a -> b) -> f a -> f b
Bagaimana itu berbeda dari antarmuka [1] (dalam sintaksis Java)
interface Functor<A> {
<B> Functor<B> fmap(Function<B, A> fn)
}
interface Function<Return, Argument> {
Return apply(Argument arg);
}
Satu perbedaan yang mungkin saya pikirkan adalah bahwa implementasi kelas tipe yang digunakan pada doa tertentu tidak ditentukan tetapi ditentukan dari lingkungan - katakanlah, memeriksa modul yang tersedia untuk implementasi untuk tipe ini. Itu tampaknya merupakan artefak implementasi yang dapat diatasi dalam bahasa OO; seperti kompiler (atau runtime) dapat memindai pembungkus / extender / monyet-patcher yang memperlihatkan antarmuka yang diperlukan pada jenisnya.
Apa yang saya lewatkan?
[1] Perhatikan bahwa f a
argumen telah dihapus fmap
sejak diberikan sebagai bahasa OO, Anda akan memanggil metode ini pada objek. Antarmuka ini menganggap f a
argumen telah diperbaiki.