Mengapa ini tidak setara?
show $ if someCondition then someInt else some double
dan
if someCondition then show someInt else show someDouble
Saya mengerti bahwa jika Anda mengisolasi if ... elsebagian dalam contoh pertama ke ekspresi dengan sendirinya maka Anda tidak dapat mewakili tipenya dengan tipe jumlah anonim, jenis Int | Double, seperti sesuatu yang dapat Anda lakukan dengan mudah dalam TypeScript (menyebutkan TypeScript karena itu adalah langauge saya sering menggunakan dan yang mendukung tipe Sum), dan harus menggunakan Eitherdata kemudian berdasarkan itu akan memanggil show.
Contoh yang saya berikan di sini adalah sepele tetapi bagi saya lebih masuk akal untuk berpikir "Oke kita akan menunjukkan sesuatu, dan bahwa sesuatu tergantung pada someCondition" daripada "Okay jika someCondition benar lalu perlihatkan someInt sebaliknya tunjukkan someDouble", dan juga memungkinkan untuk lebih sedikit duplikasi kode (di sini pertunjukan diulang dua kali tetapi bisa juga merupakan aplikasi fungsi yang panjang dan alih-alih if ... elseada> 2 cabang yang perlu dipertimbangkan)
Dalam pikiran saya seharusnya mudah bagi kompiler untuk memeriksa apakah masing-masing jenis yang membuat jumlah jenis (di sini Int | Double) dapat digunakan sebagai parameter untuk showberfungsi dan memutuskan apakah jenis sudah benar atau tidak. Bahkan lebih baik adalah bahwa showfungsi selalu mengembalikan stringapa pun jenis parameternya, sehingga kompiler tidak harus membawa semua "cabang" yang mungkin (jadi semua jenis yang mungkin).
Apakah karena pilihannya fitur seperti itu tidak ada? Atau apakah saya menerapkannya lebih sulit?
making all conversions explicit. Dalam pertanyaan saya, saya tidak ingin Haskell melemparkan Intke Doubleatau sebaliknya. Saya hanya menggunakan dua jenis itu sebagai contoh. Anda dapat mengganti setiap Intdengan adan Doubledengan bpertanyaan saya di mana kedua jenis berasal Show. Saya mengerti bahwa tidak ada anonymous sum typesdi Haskell tapi saya ingin tahu mengapa itu yang terjadi dan apa yang menghentikan kami dari mendesain bahasa untuk memilikinya.
x :: Int | Booldan kita harus mengkompilasi show x, tidak ada cara mudah untuk mengetahui fungsi pointer-to mana yang digunakan untuk memanggil show, dalam RTS berbasis tipe-erasure. Kami mungkin perlu menyimpan beberapa informasi tingkat jenis pada saat runtime.
(String, Int)bukan anonim. Ini hanya tipe produk biasa dengan sintaks lucu. (String | Int)akan jauh berbeda. Mulailah dengan bertanya pada diri sendiri apakah (Int|Int)harus identik dengan Intdan mengapa.
if ... then ... else ..., harus memiliki tipethendanelsebagian yang sama. Anda dapat melihatnya sebagai operator ternary dalam beberapa bahasa pemrograman.