Mengapa Haskell memiliki built-in if/then/else
, yang tergantung pada Bool
jenisnya, alih-alih memiliki fungsi pustaka yang sederhana? Seperti
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Mengapa Haskell memiliki built-in if/then/else
, yang tergantung pada Bool
jenisnya, alih-alih memiliki fungsi pustaka yang sederhana? Seperti
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Jawaban:
Ini murni untuk gula bagus dari if
, then
, dan else
kata kunci; pada kenyataannya, GHC (dengan RebindableSyntax
ekstensi diaktifkan) akan menghapus sintaks dengan hanya memanggil ifThenElse
fungsi apa pun yang ada dalam ruang lingkup.
Tidak masalah ... bagi saya kelihatannya jika / saat itu / itu tidak terlalu sering digunakan saat ini. Saya menemukan diri saya menulis penjaga pola instad jika .. lalu .. lain.
Dari sudut pandang sintaksis, itu baik untuk dimiliki
if expr1 then expr2 else expr3
Jadi kamu bisa menulis
if foo a then bar b else baz c
dari pada
if (foo a) (bar b) (baz c)
yang terlihat agak terlalu LISPish bagi saya.
Untuk analisis semantik dan pembuatan kode, senang memiliki konstruk ini, yang dapat dengan mudah dikompilasi ke kode mesin yang efisien. Perhatikan bahwa kode dapat melewati bagian yang membuat pukulan untuk cabang yang tidak tercapai, sebagai lawan panggilan fungsi, di mana semua parameter (yang tidak dievaluasi) harus dilewati. Tetapi juga membutuhkan waktu (dan memori, yang harus direklamasi nanti) untuk membuat thunk. Untuk memperbaiki ini, orang harus inline fungsi if di mana-mana.