I / O W Haskell jest funkcjonalny?
Jestem dopiero zaczynam przyjrzeć się Haskellowi( moje poprzednie doświadczenie w FP jest w Scheme), i natknąłem się na ten kod :
do { putStrLn "ABCDE" ; putStrLn "12345" }
Dla mnie to jest programowanie proceduralne, jeśli w ogóle -- szczególnie ze względu na następczą naturę skutków ubocznych.
Czy ktoś mógłby wyjaśnić, w jaki sposób ten kod jest "funkcjonalny" pod jakimkolwiek względem?
5 answers
Chociaż wydaje się, że jest to program proceduralny, powyższa składnia jest tłumaczona na program funkcjonalny, jak tak:
do { putStrLn "ABCDE" ; putStrLn "12345" }
=>
IO (\ s -> case (putStrLn "ABCDE" s) of
( new_s, _ ) -> case (putStrLn "12345" new_s) of
( new_new_s, _) -> ((), new_new_s))
To jest szereg zagnieżdżonych funkcji, które mają unikalny parametr świata, przez który są łączone, sekwencjonując wywołania do prymitywnych funkcji "proceduralnie". Ten projekt obsługuje kodowanie imperatywnego programowania w języku funkcjonalnym.
Najlepszym wstępem do semantycznych decyzji leżących u podstaw tego projektu jest " niezręczna Squad " papier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-19 00:24:38
Myślę, że nie możemy jednoznacznie odpowiedzieć na to pytanie, ponieważ "funkcjonalny" jest pojęciem rozmytym i istnieją sprzeczne idee tego, co to znaczy. Preferuję więc sugerowany przez Petera Landina termin zastępczy "denotacyjny", który jest precyzyjny i merytoryczny, a dla mnie sercem i duszą programowania funkcyjnego i co czyni go dobrym dla rozumowania równościowego. Zobacz te komentarze dla niektórych wskazówek do definicji Landina. IO
jest nie denotacyjnym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-20 07:56:23
Pomyśl o tym w ten sposób. W rzeczywistości nie" wykonuje " instrukcji IO. Monada IO jest czystą wartością, która zawiera "imperatywne obliczenia" do wykonania (ale w rzeczywistości tego nie wykonuje). Możesz umieścić monady (obliczenia) razem w większe "obliczenia" w czysty sposób za pomocą operatorów monad i konstruktów takich jak "do". Mimo to nic nie jest" wykonywane " jako takie. W rzeczywistości, w pewnym sensie całym celem programu Haskell jest złożenie Wielkiego "obliczenia", które jest jego main
wartość (która ma typ IO a
). A kiedy uruchamiasz program, to właśnie" obliczenia " są uruchamiane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-19 00:59:19
To jest monada . Przeczytaj o do-notation , aby wyjaśnić, co dzieje się za okładkami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-19 00:57:51
To nie jest kod funkcjonalny. Dlaczego?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-19 21:43:07