Ho un po 'di esperienza nella scrittura di piccoli strumenti in Haskell e lo trovo molto intuitivo da usare, specialmente per scrivere filtri (usando interact
) che elaborano il loro input standard e lo collegano allo standard output.
Recentemente ho provato ad usare uno di questi filtri su un file che era circa 10 volte più grande del solito e ho ottenuto un errore di Stack space overflow
.
Dopo aver fatto qualche lettura (es. qui e qui ) Ho identificato due linee guida per risparmiare spazio nello stack (Haskellers esperti, correggimi se scrivo qualcosa che non è corretto):
- Evita le chiamate ricorsive di funzioni che non sono ricorsive in coda (questo è valido per tutti i linguaggi funzionali che supportano l'ottimizzazione di coda).
- Introduci
seq
per 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 utilizzano la valutazione lazy).
Dopo aver introdotto cinque o sei% chiamate diseq
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.
Poiché non sono un programmatore Haskell esperto, volevo chiedere se introdurre seq
in questo modo sia una pratica comune e quanto spesso si vedrà normalmente seq
nel codice di produzione Haskell. O ci sono tecniche che permettono di evitare di usare seq
troppo spesso e di usare ancora poco spazio nello stack?