Ho una certa esperienza nella scrittura di piccoli strumenti in Haskell e lo trovo molto intuitivo da utilizzare, in particolare per la scrittura di filtri (che utilizzano interact) che elaborano il loro input standard e lo collegano all'output standard.
Di recente ho provato a utilizzare uno di questi filtri su un file che era circa 10 volte più grande del solito e ho riscontrato un Stack space overflowerrore.
Dopo aver letto (ad esempio qui e qui ) ho identificato due linee guida per risparmiare spazio nello stack (esperti Haskeller, per favore correggimi se scrivo qualcosa che non è corretto):
- Evitare le chiamate di funzione ricorsive che non sono ricorsive della coda (questo è valido per tutti i linguaggi funzionali che supportano l'ottimizzazione della coda).
- Introdurre
seqa forzare la valutazione precoce delle sottoespressioni in modo che le espressioni non diventino troppo grandi prima di essere ridotte (questo è specifico per Haskell, o almeno per le lingue che usano la valutazione pigra).
Dopo aver introdotto cinque o sei seqchiamate nel mio codice, il mio strumento funziona di nuovo senza problemi (anche sui dati più grandi). Tuttavia, trovo che il codice originale fosse un po 'più leggibile.
Dato che non sono un programmatore esperto di Haskell, volevo chiedere se introdurre seqin questo modo fosse una pratica comune e quanto spesso si vedrà normalmente seqnel codice di produzione di Haskell. Oppure ci sono tecniche che consentono di evitare di sequsarle troppo spesso e di utilizzare ancora poco spazio nello stack?