Haskell'de küçük aletler yazma konusunda bazı deneyimlerim var ve özellikle interactstandart 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 overflowhata 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).
seqAlt 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 seqHaskell ü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ı?