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 overflow
errore.
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
seq
a 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 seq
chiamate 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 seq
in questo modo fosse una pratica comune e quanto spesso si vedrà normalmente seq
nel codice di produzione di Haskell. Oppure ci sono tecniche che consentono di evitare di seq
usarle troppo spesso e di utilizzare ancora poco spazio nello stack?