2013-08-22 11 views
7

Mi piace molto Haskell, in particolare è un sistema di tipo forte. Quando faccio compilare i programmi di Haskell, sono generalmente privi di bug, o almeno molto vicini.Utilizzo dello spazio sicuro per tipo Haskell

Tuttavia, il problema principale con Haskell è il suo utilizzo di spazio sconosciuto. Almeno per dire, C++, puoi essere abbastanza sicuro dell'uso dello spazio di un programma. È abbastanza chiaro quando costruisci e decostruisci oggetti.

In Haskell, le cose semplici come le pieghe possono utilizzare una notevole quantità di spazio nei thunk se non le scrivi correttamente. Il programma si blocca a causa della mancanza di memoria non è molto meglio di qualche altro bug, probabilmente peggio.

So che ci sono modi per evitare queste perdite di spazio, ma sto cercando modi sicuri per il tipo per evitare queste perdite di spazio. Ad esempio, se ho sbagliato, avrò una specie di errore di compilazione, non solo spero che il mio programma si blocchi dalla memoria quando è in produzione. Ad esempio, sono felice di sostituire le funzioni di libreria standard (forse, diciamo una piega che ha un errore di compilazione se l'accumulatore non è rigido ad esempio)

Esiste una cosa del genere in Haskell?

+0

Assumendo questo zoo http://blog.ezyang.com/2011/05/space-leak-zoo/ quali tipi di sistema di tenuta tipo devono controllare? Per le perdite di flusso sono sufficienti condotte. –

+0

Perdite di Thunk ad esempio. Puoi anche spiegare come funzionano i conduit con codice puro per controllare l'utilizzo dello spazio (cioè qualcosa che trapela con una lista ma non con un conduit? – Clinton

+0

Ci sono un certo numero di costruzioni come conduit che sono progettate per consentire di elaborare flussi di dati in un tasso controllato: includono iterate, conduit, pipe e io-stream nonché alcune librerie per il calcolo ad alte prestazioni che eseguono un'ottimizzazione nota come stream fusion –

risposta

1

È risaputo che il ragionamento sullo spazio in Haskell è estremamente difficile. Il vecchio (1987) libro di Simon Peyton-Jones

http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/

ha un capitolo speciale su questo argomento.

Tuttavia, se si scrive codice Haskell in modi particolari, ad esempio utilizzando semplici generatori, è possibile controllare l'utilizzo della memoria . Il seguente lavoro (presentato ad APLAS 2012) fornisce un esempio di ragionamento sulla memoria e sulla latenza per un algoritmo abbastanza complesso, lineare pretty printing (BTW, le librerie standard di pretty-printing in Haskell sono tutt'altro che ottimali: il loro tempo di formattazione è O (n), dove n è la lunghezza dell'ingresso). I risultati sperimentali confermano le previsioni di memoria e complessità temporale. Si prega di vedere le diapositive del discorso APLAS, che mostrano i complotti.

http://okmij.org/ftp/continuations/PPYield/index.html

Problemi correlati