Jaka jest różnica między czystym a nieczystym w haskell? Czy podczas wykonywania IO w haskell należy zachować oddzielne czyste i nieczyste przedmioty?Jaka jest różnica między czystym a nieczystym w haskell?
Odpowiedz
Zasadniczo chcesz zachować jako mało kodu, jak to możliwe w sekcji „nieczystej”. Kod napisany w monadzie IO jest zawsze skażony brakiem bezpieczeństwa. Funkcja z podpisem IO Int
zwróci liczbę całkowitą w monadzie IO, ale może na nią nadejść pocisk nuklearny na księżyc. Nie mamy możliwości poznania bez przestudiowania każdej linii kodu.
Na przykład, powiedzmy, że chcesz napisać program, który pobiera ciąg znaków i dołącza do niego ", stary".
main = do
line <- getLine
putStrLn $ line ++ ", dude"
Niektóre części kodu muszą być w monady IO, ponieważ mają skutki uboczne. Obejmuje to getLine i putStrLn. Jednak połączenie dwóch strun nie jest możliwe.
main = do
line <- getLine
putStrLn $ addDude line
addDude input = input ++ ", dude"
Podpis addDude pokazuje, że jest czysty: String -> String
. No IO
tutaj. Oznacza to, że możemy założyć, że addDude zachowa się przynajmniej w ten sposób. Zajmie jeden ciąg i zwróci jeden ciąg. Niemożliwe jest, aby miał efekty uboczne. Nie można wysadzić księżyca.
Dobra odpowiedź. Przepraszamy za możliwość naprawienia literówki w kodzie. Sugerowałbym również, że podpis 'addDude' byłby lepszy w pokazywaniu czystości, gdyby był obecny w kodzie. Jednym z powodów pisania podpisów typu jawnego jest właśnie udokumentowanie i weryfikacja, co złego na pewno się nie wydarzy. – pigworker
+1 Fajna odpowiedź, koleś! – Landei
@pigworker, dzięki! Wiesz, myślałem o umieszczeniu go tam, nie byłem pewien, czy to by miało znaczenie, więc poszłam na wzajemność. –
Czystość oznacza po prostu, powodując żadnych skutków ubocznych (odczyt z dysku, ruchomym ramieniem robota, etc.)
Oddzielenie funkcji czysta od nieczystych oznacza, że można dowiedzieć się więcej o tym, co Twój kod ma zamiar zrobić. Na przykład, gdy powiesz 1 + 2
, wiesz na pewno, że jego typ (Int -> Int -> Int
) sprawia, że jedyne co robi, to wziąć dwie liczby i wytworzyć trzecią liczbę. Jeśli jego typ to Int -> Int -> IO Int
, może przesuwać ramię robota za każdym razem, gdy doda dwie liczby.
to dobry punkt wyjścia do podstawy Haskell można znaleźć tutaj: http://learnyouahaskell.com/introduction#so-whats-haskell
Wszystko w Haskell jest czyste. To, o czym czytasz, prawdopodobnie dotyczy kodu wewnątrz IO mondad kontra na zewnątrz. Po dodaniu czegoś do monopolu IO, nigdy nie może "uciec" - musisz pozostać w monadzie IO. Dlatego też monada IO ma tendencję do "atakowania" twojego kodu - jeśli masz rzecz, która zwraca IO, to każdy kod, który wywołuje, również musi zwrócić IO, i tak dalej. Dlatego najlepiej jest używać monopolu IO tylko tam, gdzie jest to konieczne, na najwyższym poziomie programu, jak to możliwe, i oddzielać wszelkie części obliczeń, które są czyste w czyste funkcje.
- 1. Jaka jest różnica między == a === w Verilog?
- 2. Jaka jest różnica między $ a a $$ a w php?
- 3. Jaka jest różnica między Ember.computed.alias a Ember.binding?
- 4. Jaka jest różnica między pakietem a intencją?
- 5. Jaka jest różnica między krotką a kompresją?
- 6. Jaka jest różnica między uchwytem a wątkiem?
- 7. Jaka jest różnica między cancelBubble a stopPropagation?
- 8. Jaka jest różnica między HAVING a WHERE?
- 9. Jaka jest różnica między użytkownikiem a rolą?
- 10. Jaka jest różnica między StudlyCaps a CamelCase?
- 11. Jaka jest różnica między Const a Constant?
- 12. Jaka jest różnica między @Inject a @PersistenceContext?
- 13. Jaka jest różnica między preferredLocalization a preferredLanguage?
- 14. Jaka jest różnica między JavaBean a POJO?
- 15. Jaka jest różnica między podprocesiem.popen a podprocesią.run?
- 16. Jaka jest różnica między funkcjami a zamknięciami?
- 17. Jaka jest różnica między ramką a ramką?
- 18. Jaka jest różnica między hashowaniem a indeksowaniem?
- 19. Jaka jest różnica między UIViewController a UITableViewController
- 20. Jaka jest różnica między przyszłym a shared_future?
- 21. Jaka jest różnica między tasklet a workqueue
- 22. Jaka jest różnica między Listą a ArrayList?
- 23. Jaka jest różnica między PermGenem a Metaspace?
- 24. Jaka jest różnica między Dispatcher.BeginInvoke a Task.Factory.StartNew
- 25. Jaka jest różnica między SUMĄ a SUBTOTALEM?
- 26. jaka jest różnica między CONTENT_FILTER_URI a CONTENT_URI?
- 27. Jaka jest różnica między process.cwd() a __dirname?
- 28. Jaka jest różnica między ItemTemplate a ItemPanelTemplate?
- 29. Jaka jest różnica między spark.sql.shuffle.partitions a spark.default.parallelism?
- 30. Jaka jest różnica między spin_lock a raw_spin_lock()?
To podstęp! Wszystko w Haskell jest czyste - musisz wyjść poza Haskella (jak do systemu uruchomieniowego), aby uzyskać coś nieczystego. (... ale nie jest to przydatna odpowiedź aż do bardzo późnego doświadczenia Haskell.) –