Saya menyadari beberapa hal lebih mudah / lebih sulit dalam satu bahasa daripada yang lain, tetapi saya hanya tertarik pada fitur terkait jenis yang mungkin dalam satu bahasa dan tidak mungkin / tidak relevan dengan yang lain. Untuk membuatnya lebih spesifik, mari kita abaikan ekstensi jenis Haskell karena ada begitu banyak di luar sana yang melakukan semua jenis hal gila / keren.
java
haskell
type-systems
static-typing
GlenPeterson
sumber
sumber
Jawaban:
("Java", seperti yang digunakan di sini, didefinisikan sebagai standar Java SE 7 ; "Haskell", seperti yang digunakan di sini, didefinisikan sebagai standar Haskell 2010. )
Hal-hal yang dimiliki sistem tipe Java tetapi Haskell tidak:
Hal-hal yang dimiliki sistem tipe Haskell tetapi Java tidak:
SUNTING:
Contoh masing-masing poin yang tercantum di atas:
Unik untuk Jawa (dibandingkan dengan Haskell)
Polimorfisme subtipe nominal
Informasi jenis runtime parsial
Unik untuk Haskell (dibandingkan dengan Jawa)
Polimorfisme ad-hoc terbatas
Polimorfisme subtipe "berbasis kendala" (berdasarkan polimorfisme ad-hoc terbatas)
Polimorfisme parametrik yang lebih baik
Pengetikan kepala sekolah
Yang ini sulit untuk memberikan contoh langsung, tetapi itu berarti bahwa setiap ungkapan memiliki tepat satu jenis umum secara maksimal (disebut jenis utamanya ), yang dianggap sebagai jenis kanonik dari ungkapan itu. Dalam hal polimorfisme subtipe "berbasis kendala" (lihat di atas), tipe utama dari sebuah ekspresi adalah subtipe unik dari setiap jenis yang mungkin digunakan untuk ekspresi tersebut. Kehadiran pengetikan utama dalam (tidak diperluas) Haskell adalah yang memungkinkan inferensi tipe lengkap (yaitu, inferensi tipe yang berhasil untuk setiap ekspresi, tanpa anotasi jenis apa pun yang diperlukan). Ekstensi yang melanggar pengetikan utama (yang jumlahnya banyak) juga merusak kelengkapan inferensi tipe.
sumber
l
sebagai variabel huruf tunggal, itu SANGAT sulit untuk dibedakan1
!Typeable
, tapi Haskell 2010 tidak memilikinya (mungkin Haskell 2014 akan melakukannya?).Sistem tipe Java tidak memiliki polimorfisme jenis yang lebih tinggi; Sistem tipe Haskell memilikinya.
Dengan kata lain: di Jawa, konstruktor tipe dapat abstrak lebih dari tipe, tetapi tidak lebih dari tipe konstruktor, sedangkan di Haskell, tipe konstruktor dapat abstrak lebih dari tipe konstruktor serta tipe.
Dalam bahasa Inggris: di Java generik tidak dapat mengambil tipe generik lain dan parameterisasi itu,
sementara di Haskell ini cukup mudah
sumber
<T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)
. Idenya di sini adalah bahwa jika seseorang memanggilnya karenaconvertStringsToInts<ArrayList>
akan mengambil arraylist string dan mengembalikan arraylist integer. Dan jika mereka malah digunakanconvertStringsToInts<LinkedList>
, itu akan sama dengan daftar yang terhubung sebagai gantinya.forall
tipe Anda. Dalam Haskell, suatu tipea -> b
secara implisitforall a. forall b. a -> b
. Dengan ekstensi, Anda bisa membuatnya lebihforall
eksplisit dan memindahkannya.Untuk melengkapi jawaban lainnya, sistem tipe Haskell tidak memiliki subtyping , sedangkan bahasa berorientasi objek yang diketikkan seperti halnya Java.
sumber
Satu hal yang tidak ada yang disebutkan sejauh ini adalah tipe inferensi: kompiler Haskell biasanya dapat menyimpulkan jenis ekspresi tetapi Anda harus memberi tahu kompiler Java tipe Anda secara detail. Sebenarnya, ini adalah fitur dari kompiler tetapi desain bahasa dan sistem tipe menentukan apakah inferensi tipe layak atau tidak. Secara khusus, tipe inferensi berinteraksi buruk dengan polimorfisme subtipe Java dan kelebihan ad hoc. Sebaliknya, para perancang Haskell berusaha keras untuk tidak memperkenalkan fitur-fitur yang berdampak pada inferensi tipe.
Hal lain yang tampaknya belum disebutkan orang sejauh ini adalah tipe data aljabar. Yaitu, kemampuan untuk membangun tipe dari penjumlahan ('atau') dan produk ('dan') dari tipe lain. Kelas Java melakukan produk (bidang a dan bidang b, katakanlah) baik-baik saja. Tetapi mereka tidak benar-benar melakukan penjumlahan (bidang a atau bidang b, katakanlah). Scala harus menyandikan ini sebagai beberapa kelas kasus, yang tidak persis sama. Dan sementara ini bekerja untuk Scala, agak sulit untuk mengatakan bahwa Java memilikinya.
Haskell juga dapat membuat tipe fungsi menggunakan function constructor, ->. Meskipun metode Java memiliki tanda tangan jenis, Anda tidak bisa menggabungkannya.
Sistem tipe Java memang memungkinkan jenis modularitas yang tidak dimiliki Haskell. Akan lama sebelum ada OSGi untuk Haskell.
sumber