Haskell'de küçük aletler yazma konusunda bazı deneyimlerim var ve özellikle interact
standart girişlerini işleyen ve standart çıkışa yönlendiren filtreler yazmak için kullanmayı çok sezgisel buluyorum .
Geçenlerde böyle bir filtreyi normalden 10 kat daha büyük bir dosyada kullanmaya çalıştım ve bir Stack space overflow
hata aldım .
Biraz okuma yaptıktan sonra (örneğin burada ve burada ) Yığın alanından tasarruf etmek için iki kılavuz belirledim (deneyimli Haskellers, lütfen doğru olmayan bir şey yazarsam düzeltin):
- Özyinelemeli özyinelemeli olmayan özyinelemeli işlev çağrıları kullanmaktan kaçının (bu, özyönelti optimizasyonunu destekleyen tüm işlevsel diller için geçerlidir).
seq
Alt ifadelerin erken değerlendirmesini zorlamak için tanıtın , böylece ifadeler azaltılmadan çok fazla büyümez (Haskell'e veya en azından tembel değerlendirme kullanan dillere özgüdür).
Koduma beş veya altı seq
çağrı yaptıktan sonra , aracım tekrar sorunsuz çalışıyor (ayrıca daha büyük verilerde). Ancak, orijinal kodun biraz daha okunaklı olduğunu gördüm.
Tecrübeli bir Haskell programcısı olmadığımdan seq
, bu şekilde tanıtmanın yaygın bir uygulama olup olmadığını ve seq
Haskell üretim kodunda ne sıklıkta göreceğini sormak istedim . Yoksa seq
çok sık kullanmamaya ve çok az yığın alanı kullanmaya izin veren herhangi bir teknik var mı?