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 ... else
bagian 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 Either
data 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 ... else
ada> 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 show
berfungsi dan memutuskan apakah jenis sudah benar atau tidak. Bahkan lebih baik adalah bahwa show
fungsi selalu mengembalikan string
apa 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 Int
ke Double
atau sebaliknya. Saya hanya menggunakan dua jenis itu sebagai contoh. Anda dapat mengganti setiap Int
dengan a
dan Double
dengan b
pertanyaan saya di mana kedua jenis berasal Show
. Saya mengerti bahwa tidak ada anonymous sum types
di Haskell tapi saya ingin tahu mengapa itu yang terjadi dan apa yang menghentikan kami dari mendesain bahasa untuk memilikinya.
x :: Int | Bool
dan 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 Int
dan mengapa.
if ... then ... else ...
, harus memiliki tipethen
danelse
bagian yang sama. Anda dapat melihatnya sebagai operator ternary dalam beberapa bahasa pemrograman.