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?

Author: Mehrdad, 2011-06-19

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,

Tutaj wpisz opis obrazka

 20
Author: Don Stewart,
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.

 13
Author: Conal,
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.

 5
Author: newacct,
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.

 3
Author: rid,
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?

 0
Author: Antoine Latter,
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