• Artykuły
  • Forum
  • Ciekawostki
  • Encyklopedia
  • Monada - programowanie

    Przeczytaj także...
    Urządzenie wejścia-wyjścia, urządzenie we/wy, urządzenie I/O (ang. input/output device) służy do komunikacji systemu komputerowego z jego użytkownikiem lub innym systemem przetwarzania danych. Urządzenie wejścia-wyjścia służy często do zamiany wielkości fizycznych na dane przetwarzane przez system lub odwrotnie. Np. mysz komputerowa przetwarza ruch ręki, odbiornik GPS aktualne położenie geograficzne, a monitor komputera przetwarza dane komputerowe na obraz.Abstrakcyjny typ danych (ang. Abstract data type - ADT) jest to tworzenie i opisywanie w formalny sposób typów danych tak, że opisywane są jedynie własności danych i operacji wykonywanych na nich (a nie przez reprezentację danych i implementację operacji).
    Przetwarzanie współbieżne (ang. concurrent computing) – przetwarzanie oparte na współistnieniu wielu wątków lub procesów, operujących na współdzielonych danych. Wątki uruchomione na tym samym procesorze są przełączane w krótkich przedziałach czasu, co sprawia wrażenie, że wykonują się równolegle.

    Monada – w programowaniu funkcyjnym: rodzaj konstruktora abstrakcyjnego typu danych, który implementuje funkcje wiązania (ang. bind) oraz jednostki (ang. unit). Pojęcie to wywodzi się z teorii kategorii, gdzie omawiany abstrakt stanowi monadę nad kategorią typów z funkcjami jako morfizmami. Jednostka określa operację tworzenia singletonu czy też akcji, której wynikiem jest zadana wartość. Wiązanie (w niektórych językach określane jako flat map) buduje na podstawie wyniku poprzedniego obliczenia nowe obliczenie, zachowując przy tym jego formę.

    Scala − język programowania łączący cechy języków funkcyjnych i obiektowych. Scala działa na Wirtualnej Maszynie Javy, a także na Java Platform, Micro Edition Connected Limited Device Configuration i platformie .NET. Nazwa ma za zadanie podkreślać skalowalność języka, stąd Scala ("scalable language").W programowaniu obiektowym klasa jest częściową lub całkowitą definicją dla obiektów. Definicja obejmuje dopuszczalny stan obiektów oraz ich zachowania. Obiekt, który został stworzony na podstawie danej klasy nazywany jest jej instancją. Klasy mogą być typami języka programowania - przykładowo, instancja klasy Owoc będzie mieć typ Owoc. Klasy posiadają zarówno interfejs, jak i strukturę. Interfejs opisuje, jak komunikować się z jej instancjami za pośrednictwem metod, zaś struktura definiuje sposób mapowania stanu obiektu na elementarne atrybuty.

    Jedną z głównych cech monad jest to, że pozwalają wynieść pewne mechanizmy i zachowania do abstrakcji, zwalniając tym samym programistę z konieczności ręcznej obsługi kontekstu. Przykładowo, działając na (jakkolwiek zdefiniowanych) zbiorach można opisać jednostkę jako

    oraz wiązanie jako

    Zbiór – pojęcie pierwotne teorii zbiorów (znanej szerzej jako teoria mnogości; za jej twórcę uważa się Georga Cantora) leżące u podstaw całej matematyki; intuicyjnie jest to nieuporządkowany zestaw różnych obiektów, czy też kolekcja niepowtarzających się komponentów bez wyróżnionej kolejności.Programowanie funkcyjne (lub programowanie funkcjonalne) – filozofia i metodyka programowania będąca odmianą programowania deklaratywnego, w której funkcje należą do wartości podstawowych, a nacisk kładzie się na wartościowanie (często rekurencyjnych) funkcji, a nie na wykonywanie poleceń.

    by potem w sposób generyczny budować potoki danych w kompletnym oderwaniu od wewnętrznej implementacji czy nawet interpretacji. Dla przykładu konstruowanie iloczynu kartezjańskiego dwóch zbiorów mogłoby przebiegać tak:

    Zbiór jednoelementowy – w teorii mnogości zbiór, do którego należy jeden i tylko jeden element; czasami nazywany jest zbiorem jednostkowym lub singletonem. Zbiór zawierający wyłącznie element y oznacza się zwykle {y}; można go scharateryzować w następujący sposób:Wyjątek (ang. exception) jest mechanizmem przepływu sterowania używanym w mikroprocesorach oraz współczesnych językach programowania do obsługi zdarzeń wyjątkowych, a w szczególności błędów, których wystąpienie zmienia prawidłowy przebieg wykonywania programu. W momencie zajścia niespodziewanego zdarzenia generowany jest wyjątek, który musi zostać obsłużony poprzez zapamiętanie bieżącego stanu programu i przejście do procedury jego obsługi. W niektórych sytuacjach po obsłużeniu wyjątku można powrócić do wykonywania przerwanego kodu, korzystając z zapamiętanych informacji stanu. Przykładowo obsługa błędu braku strony pamięci polega najczęściej na pobraniu brakującej strony z pliku wymiany, co umożliwia kontynuowanie pracy programu, natomiast błąd dzielenia przez zero powoduje, że wykonywanie dalszych obliczeń nie ma sensu i musi zostać przerwane na trwałe.

    Istotne w tym przykładzie to, że przy definiowaniu operacji prod ani razu nie skorzystano z faktu, że nośnikiem danych jest matematyczny zbiór. Będzie ona zatem działać dla każdej monady, bez względu na jej wewnętrzną reprezentację.

    Wzorzec projektowy (ang. design pattern) – w inżynierii oprogramowania, uniwersalne, sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych problemów projektowych. Pokazuje powiązania i zależności pomiędzy klasami oraz obiektami i ułatwia tworzenie, modyfikację oraz pielęgnację kodu źródłowego. Jest opisem rozwiązania, a nie jego implementacją. Wzorce projektowe stosowane są w projektach wykorzystujących programowanie obiektowe.

    To podejście stanowi popularny wzorzec projektowy, który ma szerokie zastosowanie przy definiowaniu obliczeń zawierających dodatkowe reguły przetwarzające, jak chociażby transformowanie stanu, współbieżność, obsługę wejścia-wyjścia lub wyjątków.

    Przykłady[ | edytuj kod]

    Haskell[ | edytuj kod]

    W Haskellu monada jest klasą zrzeszającą typy o rodzaju

    class Monad m where
      (>>=) :: m a -> (a -> m b) -> m b
      (>>) :: m a -> m b -> m b
      return :: a -> m a
      fail :: String -> m a
    

    Operacje wiązania >> oraz >>= łączą ze sobą dwie wartości monadyczne, podczas gdy operacja return umieszcza wartość w monadzie. Operator >>= formuje wartość monadyczną obliczającą wynik typu b na podstawie wyniku lewego argumentu będącego wartością monadyczną z wynikiem typu a. Funkcja >> jest używana wtedy, gdy przebieg wiązania nie zależy od wyniku lewego argumentu, a jedynie od jego kontekstu. Haskell posiada syntaktyczne wsparcie monad przy użyciu tzw. notacji do:

    bez_do :: (Monad m, Alternative m) => m Int -> m Int -> m Int
    bez_do m1 m2 =
      m1 >>= \x1 -> m2 >>= \x2 -> guard (x2 /= 0) >> return (x1 / x2)
    
    z_do :: (Monad m, Alternative m) => m Int -> m Int -> m Int
    z_do m1 m2 = do
      x1 <- m1
      x2 <- m2
      guard (x2 /= 0)
      return (x1 / x2)
    

    Scala[ | edytuj kod]

    W Scali monadą jest każda klasa, która implementuje operacje flatMap oraz unit

    trait M[A] {
      def flatMap[B](f: A => M[B]): M[B]
    }
    
    def unit[A](x: A): M[A]
    

    Odpowiednikiem notacji do w Scali jest for comprehensions:

    def bez_for(m1 : M[Int], m2 : M[Int]) : M[Int] =
      m1.flatMap(x1 => m2.flatMap(x2 => unit[M](x1 + x2)))
    
    def z_for(m1 : M[Int], m2 : M[Int]) : M[Int] =
      for {
        x1 <- m1
        x2 <- m2
      } yield (x1 + x2)
    

    Przypisy[ | edytuj kod]

    1. Haskell Programming From First Principles Christopher Allen, Julie Moronuki, s. 755–799.
    2. Demystifying the Monad in Scala, Developer News, 4 grudnia 2015 [dostęp 2019-07-20] (ang.).




    Reklama

    Czas generowania strony: 0.607 sek.