Saya memiliki pengalaman menulis alat kecil di Haskell dan saya merasa sangat intuitif untuk digunakan, terutama untuk menulis filter (menggunakan interact
) yang memproses input standar mereka dan menyalurkannya ke output standar.
Baru-baru ini saya mencoba menggunakan satu filter seperti itu pada file yang sekitar 10 kali lebih besar dari biasanya dan saya mendapat Stack space overflow
kesalahan.
Setelah melakukan beberapa pembacaan (misalnya di sini dan di sini ) saya telah mengidentifikasi dua pedoman untuk menghemat ruang tumpukan (Haskeller berpengalaman, perbaiki saya jika saya menulis sesuatu yang tidak benar):
- Hindari panggilan fungsi rekursif yang tidak berulang-ulang (ini berlaku untuk semua bahasa fungsional yang mendukung optimisasi panggilan-balik).
- Perkenalkan
seq
untuk memaksa evaluasi awal sub-ekspresi sehingga ekspresi tidak tumbuh terlalu besar sebelum dikurangi (ini khusus untuk Haskell, atau setidaknya untuk bahasa yang menggunakan evaluasi malas).
Setelah memasukkan lima atau enam seq
panggilan dalam kode saya, alat saya berjalan dengan lancar lagi (juga pada data yang lebih besar). Namun, saya menemukan kode asli sedikit lebih mudah dibaca.
Karena saya bukan programmer Haskell yang berpengalaman, saya ingin bertanya apakah memperkenalkan seq
dengan cara ini adalah praktik yang umum, dan seberapa sering orang akan melihat seq
kode produksi Haskell. Atau apakah ada teknik yang memungkinkan untuk menghindari penggunaan seq
terlalu sering dan masih menggunakan sedikit ruang stack?