Saya menemukan evaluasi malas berguna untuk sejumlah hal.
Pertama, semua bahasa lazy yang ada adalah murni, karena sangat sulit untuk menjelaskan efek samping dalam bahasa lazy.
Bahasa murni memungkinkan Anda bernalar tentang definisi fungsi menggunakan penalaran persamaan.
foo x = x + 3
Sayangnya, dalam setelan non-malas, lebih banyak pernyataan yang gagal ditampilkan daripada setelan malas, jadi ini kurang berguna dalam bahasa seperti ML. Tapi dalam bahasa malas Anda bisa dengan aman bernalar tentang kesetaraan.
Kedua, banyak hal seperti 'batasan nilai' di ML tidak diperlukan dalam bahasa lazy seperti Haskell. Ini mengarah ke deklarasi sintaks yang bagus. Bahasa seperti ML perlu menggunakan kata kunci seperti var atau fun. Di Haskell hal-hal ini runtuh menjadi satu gagasan.
Ketiga, kemalasan memungkinkan Anda menulis kode yang sangat fungsional yang dapat dipahami dalam beberapa bagian. Di Haskell, hal umum untuk menulis badan fungsi seperti:
foo x y = if condition1
then some (complicated set of combinators) (involving bigscaryexpression)
else if condition2
then bigscaryexpression
else Nothing
where some x y = ...
bigscaryexpression = ...
condition1 = ...
condition2 = ...
Ini memungkinkan Anda bekerja 'dari atas ke bawah' meskipun pemahaman tentang tubuh suatu fungsi. Bahasa seperti ML memaksa Anda untuk menggunakan let
yang dievaluasi secara ketat. Akibatnya, Anda tidak berani 'mengangkat' klausa let keluar ke bagian utama fungsi, karena jika mahal (atau memiliki efek samping) Anda tidak ingin selalu dievaluasi. Haskell dapat 'mendorong' detail ke klausa where secara eksplisit karena ia tahu bahwa konten klausa tersebut hanya akan dievaluasi sesuai kebutuhan.
Dalam praktiknya, kita cenderung menggunakan pelindung dan menutupnya lebih jauh untuk:
foo x y
| condition1 = some (complicated set of combinators) (involving bigscaryexpression)
| condition2 = bigscaryexpression
| otherwise = Nothing
where some x y = ...
bigscaryexpression = ...
condition1 = ...
condition2 = ...
Keempat, kemalasan terkadang menawarkan ekspresi algoritme tertentu yang jauh lebih elegan. 'Pengurutan cepat' yang malas di Haskell bersifat one-liner dan memiliki keuntungan bahwa jika Anda hanya melihat beberapa item pertama, Anda hanya membayar biaya yang sebanding dengan biaya pemilihan item tersebut saja. Tidak ada yang mencegah Anda melakukan ini secara ketat, tetapi Anda mungkin harus mengodekan ulang algoritme setiap kali untuk mencapai kinerja asimtotik yang sama.
Kelima, kemalasan memungkinkan Anda menentukan struktur kontrol baru dalam bahasa tersebut. Anda tidak dapat menulis 'if .. then .. else ..' seperti konstruksi baru dalam bahasa yang ketat. Jika Anda mencoba untuk mendefinisikan fungsi seperti:
if' True x y = x
if' False x y = y
dalam bahasa yang ketat maka kedua cabang akan dievaluasi terlepas dari nilai kondisinya. Ini menjadi lebih buruk ketika Anda mempertimbangkan loop. Semua solusi yang ketat membutuhkan bahasa untuk memberi Anda semacam kutipan atau konstruksi lambda eksplisit.
Akhirnya, dengan nada yang sama, beberapa mekanisme terbaik untuk menangani efek samping dalam sistem tipe, seperti monad, benar-benar hanya dapat diekspresikan secara efektif dalam pengaturan malas. Hal ini dapat dilihat dengan membandingkan kompleksitas Alur Kerja F # dengan Haskell Monads. (Anda dapat mendefinisikan monad dalam bahasa yang ketat, tetapi sayangnya Anda akan sering gagal satu atau dua hukum monad karena kurangnya kemalasan dan Alur Kerja dengan perbandingan mengambil banyak bagasi ketat.)