Mengapa Haskell memiliki built-in "jika / kemudian / lain" alih-alih mendefinisikannya sebagai fungsi perpustakaan sederhana?

25

Mengapa Haskell memiliki built-in if/then/else, yang tergantung pada Booljenisnya, alih-alih memiliki fungsi pustaka yang sederhana? Seperti

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y
Petr Pudlák
sumber
4
Saya kira mereka secara eksplisit menginginkan sintaks if / then / else yang tidak dapat mereka peroleh tanpa fungsi mixfix seperti di agda. Fungsi yang Anda maksud adalah terstruktur sebagai terner, yang dapat Anda implementasikan sendiri meskipun saya anggap mereka memberi kami jika / lalu / selain itu gula (kemungkinan hanya gula di atas case) hanya karena mereka bisa dan tidak berbahaya .. Tapi saya tidak punya apa-apa untuk mendukung saya di sini, itulah sebabnya saya menulis ini dalam komentar.
Jimmy Hoffa
10
Ini mungkin jelas bagi sebagian besar pembaca, tetapi saya ingin menunjukkan bahwa memiliki thenf / then / else sebagai fungsi tidak akan menjadi solusi yang baik dalam bahasa yang bersemangat (misalnya skema atau sml) sementara itu wajar dalam malas bahasa seperti Haskell.
Giorgio

Jawaban:

24

Ini murni untuk gula bagus dari if, then, dan elsekata kunci; pada kenyataannya, GHC (dengan RebindableSyntaxekstensi diaktifkan) akan menghapus sintaks dengan hanya memanggil ifThenElsefungsi apa pun yang ada dalam ruang lingkup.

Api Ptharien
sumber
6

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.

Ingo
sumber
3
Saya tidak berpikir inlining adalah masalah aktual. Pemahaman saya adalah bahwa GHC sudah sangat bagus dalam menguraikan fungsi-fungsi kecil, karena itu hanya pola yang umum di Haskell.
Tikhon Jelvis
1
@TikhonJelvis Tentu, tetapi dengan if / then / else Anda tidak memerlukan fungsi khusus yang harus selalu diuraikan. Anda bahkan tidak memerlukan inlining dan masih bisa menghasilkan kode yang layak. Tidak semua dunia adalah GHC.
Ingo