2013-03-03 12 views
13

Qual è la differenza tra puro e impuro in haskell? Quando si esegue l'I/O in haskell, cosa significa tenere separati gli elementi puri e impuri?Qual è la differenza tra puro e impuro in haskell?

+10

È un trucco! Tutto in Haskell è puro: devi uscire da Haskell (come nel sistema di runtime) per ottenere qualcosa di impuro. (... ma questa non è una risposta utile fino a molto tardi nella tua esperienza con Haskell.) –

risposta

20

In sostanza si vuole mantenere il meno possibile il codice nella sezione "impuro". Il codice scritto nella monade IO è per sempre contaminato dall'insicurezza. Una funzione con la firma IO Int restituirà un intero nella monade IO, ma potrebbe anche inviare missili nucleari alla luna. Non abbiamo modo di saperlo senza studiare ogni riga del codice.

Ad esempio, supponiamo di voler scrivere un programma che accetta una stringa e aggiunge ", amico" ad esso.

main = do 
    line <- getLine 
    putStrLn $ line ++ ", dude" 

Alcune delle parti del codice sono tenuti ad essere in monade IO, perché hanno effetti collaterali. Questo include getLine e putStrLn. Tuttavia, mettere insieme le due stringhe no.

main = do 
    line <- getLine 
    putStrLn $ addDude line 

addDude input = input ++ ", dude" 

La firma del addDude dimostra che si tratta di pura: String -> String. No IO qui. Ciò significa che possiamo assumere che addDude si comporti almeno in questo modo. Prenderà una stringa e restituirà una stringa. È impossibile che abbia effetti collaterali. È impossibile che faccia esplodere la luna.

+2

Bella risposta. Ci scusiamo per essersi preso la libertà di correggere un refuso nel codice. Suggerirei anche che la firma di "addDude" sarebbe migliore per mostrare la purezza se fosse presente nel codice. Una ragione per scrivere firme di tipo esplicito è esattamente quella di documentare e verificare quali cose brutte non accadrà sicuramente. – pigworker

+0

+1 Cool risposta, amico! – Landei

+0

@pigworker, grazie! Sai, ho pensato di metterlo lì dentro, non ero sicuro che sarebbe stato importante quindi sono andato per la precisione. –

5

Purezza significa semplicemente che non provoca effetti collaterali (lettura da un disco, si muovono un braccio robotico, ecc)

Separazione pura dalle funzioni impuri significa che è possibile sapere di più su ciò che il codice sta per fare. Ad esempio, quando si dice 1 + 2, si è sicuri per il suo tipo (Int -> Int -> Int) che l'unica cosa che fa è prendere due numeri e produrre un terzo numero. Se il suo tipo era Int -> Int -> IO Int, potrebbe spostare un braccio robot ogni volta che aggiunge i due numeri.

Un buon punto di partenza per le basi di Haskell può essere trovato qui: http://learnyouahaskell.com/introduction#so-whats-haskell

2

Tutto in Haskell è puro. Quello di cui stai leggendo riguarda probabilmente il codice all'interno di IO mondad vs. esterno. Una volta messo qualcosa nella monade IO, non può mai "scappare" - devi rimanere nella monade IO. Pertanto, la monade IO ha la tendenza a "invadere" il tuo codice - se hai una cosa che restituisce IO, allora ogni codice che chiama deve anche restituire IO, e così via. Pertanto è meglio usare la monade IO solo dove è necessario, al livello più alto possibile del programma, e separare le parti del calcolo che sono pure in pure funzioni.

Problemi correlati