Pada tingkat dasar, tidak ada banyak perbedaan, tetapi mereka masih ada di sana.
Haskell menjelaskan fungsi atau nilai yang didefinisikan dalam typeclass sebagai 'metode', sama seperti sifat menggambarkan metode OOP dalam objek yang mereka sertakan. Namun, Haskell berurusan dengan ini secara berbeda, memperlakukan mereka sebagai nilai-nilai individual daripada menyematkannya ke objek karena OOP akan membuat orang melakukannya. Ini adalah tentang perbedaan level permukaan yang paling jelas.
Satu hal yang tidak bisa dilakukan Rust untuk sementara waktu adalah sifat-sifat yang diketik tingkat tinggi , seperti kacamata yang terkenal Functor
dan Monad
buruk.
Ini berarti bahwa sifat-sifat Rust hanya bisa menggambarkan apa yang sering disebut 'tipe konkret', dengan kata lain, karakter tanpa argumen umum. Haskell sejak awal bisa membuat kacamata ketik tingkat tinggi yang menggunakan tipe yang mirip dengan bagaimana fungsi tingkat tinggi menggunakan fungsi lain: menggunakan satu untuk menggambarkan yang lain. Untuk periode waktu ini tidak mungkin di Rust, tetapi karena item terkait telah diterapkan, sifat-sifat tersebut telah menjadi biasa dan idiomatis.
Jadi jika kita mengabaikan ekstensi, mereka tidak persis sama, tetapi masing-masing dapat memperkirakan apa yang dapat dilakukan oleh yang lain.
Juga disebutkan, seperti dikatakan dalam komentar, bahwa GHC (kompilator utama Haskell) mendukung opsi lebih lanjut untuk typeclasses, termasuk typeclasses multi-parameter (yaitu banyak jenis yang terlibat), dan dependensi fungsional , pilihan yang bagus yang memungkinkan untuk perhitungan tingkat-jenis. , dan mengarah ke mengetik keluarga . Sepengetahuan saya, Rust tidak memiliki funDeps atau tipe keluarga, meskipun mungkin di masa depan. †
Semua dalam semua, ciri dan kacamata memiliki perbedaan mendasar, yang karena cara mereka berinteraksi, membuat mereka bertindak dan tampak sangat mirip pada akhirnya.
† Artikel bagus tentang kacamata Haskell (termasuk yang berjenis lebih tinggi) dapat ditemukan di sini , dan bab Karat dengan Contoh tentang sifat dapat ditemukan di sini
class Functor f where fmap :: (a -> b) -> (f a -> f b)
; contoh dari yang terakhir adalahclass Bounded a where maxBound :: a
.