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?
sumber
if ... then ... else ...
, harus memiliki tipethen
danelse
bagian yang sama. Anda dapat melihatnya sebagai operator ternary dalam beberapa bahasa pemrograman.making all conversions explicit
. Dalam pertanyaan saya, saya tidak ingin Haskell melemparkanInt
keDouble
atau sebaliknya. Saya hanya menggunakan dua jenis itu sebagai contoh. Anda dapat mengganti setiapInt
dengana
danDouble
denganb
pertanyaan saya di mana kedua jenis berasalShow
. Saya mengerti bahwa tidak adaanonymous 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 mengkompilasishow x
, tidak ada cara mudah untuk mengetahui fungsi pointer-to mana yang digunakan untuk memanggilshow
, 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 denganInt
dan mengapa.Jawaban:
Semua bagian dari ekspresi harus diketik dengan baik. Jenis
if someCondition then someInt else someDouble
harus sepertiexists a. Show a => a
, tetapi Haskell tidak mendukung kuantifikasi eksistensial semacam itu.Pembaruan: Seperti yang ditunjukkan chi dalam komentar , Haskell juga dimungkinkan jika memiliki dukungan untuk jenis gabungan / persimpangan (yang tidak sama dengan jumlah / jenis produk), tetapi sayangnya tidak.
sumber
Int ∪ Double
, maka Anda akan tahu bahwa Anda memiliki salah satu dari keduanya, tetapi tidak akan dapat mencocokkan pola untuk melihat yang mana, jadi Anda hanya dapat melakukan hal-hal yang valid untuk kedua kemungkinan tersebut.typeof
operator yang dapat menebus kurangnya penandaan dan melihat jenis yang digunakan pula. Haskell sepenuhnya terhapus jenis, jadi jika itu mendukung fitur ini, maka tidak akan ada yang setara dengan itu.Ada jenis produk dengan sintaks ringan, tertulis
(,)
, di Haskell. Satu hal yang jenis penjumlahan dengan sintaks ringan, seperti(Int | String)
, akan menjadi ide bagus. Kenyataannya lebih rumit. Mari kita lihat mengapa (saya mengambil beberapa kebebasanNum
, mereka tidak penting).Jika ini mengembalikan nilai tipe
(Int | String)
, lalu apa yang harus dikembalikan berikut?(Int | Int)
jelas, tetapi jika ini berbeda dari biasaInt
maka kita dalam masalah besar. Jadi(Int | Int)
harus identik dengan polosInt
.Orang dapat segera melihat bahwa ini bukan hanya sintaks yang ringan untuk jenis penjumlahan, tetapi fitur bahasa yang sepenuhnya baru. Jenis sistem yang berbeda jika Anda mau. Haruskah kita memilikinya?
Mari kita lihat fungsi ini.
Sekarang tipe apa yang
mysteryType
dimilikinya? Jelas sekaliBaik? Sekarang bagaimana jika
a
danb
apakah jenis yang sama?Ini harus jelas
Int
seperti yang telah kita sepakati sebelumnya. SekarangmysteryType
terkadang kembalikan jenis jumlah anonim, dan terkadang tidak, tergantung pada argumen yang Anda berikan. Bagaimana pola Anda cocok dengan ungkapan seperti itu? Apa yang bisa kamu lakukan dengan itu? Kecuali hal-hal sepele seperti "show" (atau metode apa pun dari kelas-jenis lain yang akan menjadi contoh), tidak banyak. Kecuali jika Anda menambahkan informasi jenis run-time ke bahasa, itutypeof
berarti tersedia - dan itu menjadikan Haskell bahasa yang sama sekali berbeda.Jadi ya. Mengapa Haskell bukan TypeScript? Karena kita tidak memerlukan TypeScript lain. Jika Anda ingin TypeScript, Anda tahu di mana menemukannya.
sumber