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?
risposta
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.
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
+1 Cool risposta, amico! – Landei
@pigworker, grazie! Sai, ho pensato di metterlo lì dentro, non ero sicuro che sarebbe stato importante quindi sono andato per la precisione. –
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
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.
- 1. Qual è la differenza fondamentale tra WebSockets e TCP puro?
- 2. Qual è la differenza tra mapM_ e mapM in Haskell?
- 3. Qual è la differenza tra GHC e la piattaforma Haskell?
- 4. Differenza tra "ritorno" e "puro"
- 5. Qual è la differenza tra = e: =
- 6. Qual è la differenza tra `##` e `hashCode`?
- 7. Qual è la differenza tra dict() e {}?
- 8. qual è la differenza tra:.! e: r !?
- 9. Qual è la differenza tra Verilog! e ~?
- 10. Qual è la differenza tra ("") e (null)
- 11. Qual è la differenza tra? : e ||
- 12. qual è la differenza tra [[], []] e [[]] * 2
- 13. Qual è la differenza tra $ e $$?
- 14. Qual è la differenza tra " " e ""?
- 15. Qual è la differenza tra {0} e ""?
- 16. Qual è la differenza tra {0} e +?
- 17. Qual è la differenza tra .ToString() e + ""
- 18. Qual è la differenza tra costruttori di valori e tuple?
- 19. Qual è la differenza tra "in fp" e "in fp.readlines()"?
- 20. Qual è la differenza tra modulo, pacchetto e libreria in Haskell?
- 21. Qual è la differenza tra tipo e tipo di dati in Haskell?
- 22. Qual è la differenza tra PArray e [::] in Data Parallel Haskell?
- 23. Qual è la differenza tra Metodi e Attributi in Ruby?
- 24. qual è la differenza tra @ id/e @ + id/in android?
- 25. Qual è la differenza tra 'e "in? JavaScript
- 26. Qual è la differenza tra booleano e booleano in Java?
- 27. Qual è la differenza tra target e currenttarget in flex?
- 28. In .NET, qual è la differenza tra AsFoo() e ToFoo()?
- 29. Qual è la differenza tra reindirizzamento e inoltro in Symfony?
- 30. Qual è la differenza tra identità e uguaglianza in OOP?
È 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.) –