Kita semua tahu (atau seharusnya tahu) bahwa Haskell malas secara default. Tidak ada yang dievaluasi sampai harus dievaluasi. Jadi, kapan sesuatu harus dievaluasi? Ada beberapa poin di mana Haskell harus tegas. Saya menyebutnya "titik-titik ketelitian", meskipun istilah khusus ini tidak seluas yang saya kira. Menurut saya:
Pengurangan (atau evaluasi) di Haskell hanya terjadi pada poin-poin yang ketat.
Jadi pertanyaannya adalah: apa, tepatnya , poin-poin keketatan Haskell? Intuisi saya mengatakan bahwa main
, seq
/ pola ledakan, pencocokan pola, dan IO
tindakan apa pun yang dilakukan melalui main
adalah poin keketatan utama, tetapi saya tidak benar-benar tahu mengapa saya mengetahuinya.
(Juga, jika mereka tidak disebut "kekerasan poin", apa yang mereka sebut?)
Saya membayangkan jawaban yang bagus akan mencakup beberapa diskusi tentang WHNF dan seterusnya. Saya juga membayangkan itu mungkin menyentuh kalkulus lambda.
Edit: pemikiran tambahan tentang pertanyaan ini.
Saat saya merenungkan pertanyaan ini, saya pikir akan lebih jelas untuk menambahkan sesuatu pada definisi titik keketatan. Titik keketatan dapat memiliki konteks yang berbeda-beda dan kedalaman (atau keketatan) yang berbeda -beda . Kembali ke definisi saya bahwa "pengurangan Haskell hanya terjadi pada titik-titik pengetatan", mari kita tambahkan ke definisi tersebut klausul ini: "titik pengetatan hanya dipicu ketika konteks sekitarnya dievaluasi atau dikurangi."
Jadi, izinkan saya mencoba membantu Anda memulai dengan jenis jawaban yang saya inginkan. main
adalah poin yang ketat. Ini secara khusus ditetapkan sebagai titik ketelitian utama dari konteksnya: program. Ketika program ( main
konteks) dievaluasi, titik keketatan main diaktifkan. Kedalaman induk maksimal: harus dievaluasi sepenuhnya. Utama biasanya terdiri dari tindakan IO, yang juga merupakan poin keketatan, yang konteksnya adalah main
.
Sekarang Anda mencoba: mendiskusikan seq
dan mencocokkan pola dalam istilah-istilah ini. Jelaskan nuansa aplikasi fungsi: bagaimana itu ketat? Bagaimana tidak Tentang apa deepseq
? let
dan case
pernyataan? unsafePerformIO
? Debug.Trace
? Definisi tingkat atas? Tipe data yang ketat? Pola bang? Dll. Berapa banyak dari item ini yang dapat dijelaskan hanya dalam istilah pencocokan pola atau urutan?
seq
dan pencocokan pola sudah cukup, sisanya ditentukan dalam istilah itu. Saya pikir pencocokan pola memastikan ketegasanIO
tindakan, misalnya.