Monad (informatyka)

W teorii typowanych języków funkcyjnych monada jest strukturą umożliwiającą manipulowanie czystymi językami funkcyjnymi z cechami imperatywnymi. Chodzi więc o to, aby mieć reprezentację, która dokładnie symuluje takie pojęcia, jak wyjątki lub skutki uboczne, przy jednoczesnym zachowaniu czystości języków funkcjonalnych. Stosowanie monad ma kilka zalet: analiza statyczna i dowody prostszych programów, wykorzystanie wezwania przez optymalizację konieczności ( wylesianie , wartości zapamiętywania , zrównoleglenie , silna redukcja  (in) ).

Koncepcje

Definicja formalna

Monadę można postrzegać jako dane trójki składającej się z następujących trzech elementów.

Komponując funkcję (znaną jako funkcja łączenia) z funkcją , możemy zastosować dowolną funkcję do typu monada . W tym sensie monada typu jest typem algebraicznym, który wywodzi się z typu .

Aksjomaty

Powyższej definicji towarzyszy kilka aksjomatów. Operator działa jako rodzaj neutralnego elementu dla .

posługiwać się

Najprostszym zastosowaniem monad jest zamknięcie obiektu istniejącego typu w obiekcie zawierającym więcej informacji. Na przykład w języku Haskell monada typu jest zwykłym obiektem typu t lub wartością . Pozwala to w elegancki sposób obsługiwać zabronione transakcje.

Innym podstawowym zastosowaniem monad jest zarządzanie wejściami / wyjściami w programie czysto funkcjonalnym , to znaczy bez skutków ubocznych . Tak jest w przypadku monady Haskella, która reprezentuje bezwzględny program bez parametrów i zwraca wartość typu t. Zatem getLine jest akcją typu , programem imperatywnym, który po wykonaniu zwraca ciąg znaków (ten wpisany na klawiaturze). Potwierdź, że imperatywny program zwracający a jest monadą. Z dowolnym obiektem typu możemy skojarzyć trywialny program, który zawsze zwraca . Stąd też pochodzi notacja dla typów monadycznych. Wtedy, biorąc pod uwagę funkcję g: t → t, naturalne jest, że można ją zastosować do programu, który zwraca t, co daje inny program, który zwraca t. Widzimy tę operację jako konkatenację kodu źródłowego pierwszego programu i kodu funkcji g.

W ten sposób programowanie funkcjonalne omija problem wejść / wyjść (naturalnie skutki uboczne) poprzez manipulowanie tymi koniecznymi programami, a nie wartościami, które zwracają. Aby załatwić sprawę, możemy powiedzieć, że monada typu IO (int) jest kodem C programu zwracającego liczbę całkowitą. Tak więc typ IO (int) jest całkowicie uzasadniony w ramach funkcjonalnych, ponieważ jest to po prostu tekst. Podczas kompilowania programu funkcyjnego monady te zostaną przetłumaczone na kod maszynowy, który będzie miał oczekiwany efekt po wykonaniu.

Zobacz też

Uwagi i odniesienia

  1. (in) „  Prawa monady  ”

Linki zewnętrzne

<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">