Wstęp do Programowania potok funkcyjny

Podobne dokumenty
Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Algorytm. a programowanie -

Wykład 8. Moduły. Zdzisław Spławski Programowanie funkcyjne 1

Obiektowy Caml. Paweł Boguszewski

Technologie obiektowe

Antoni M. Zajączkowski: Abstrakcyjne typy danych i typy prywatne. Pakiet Ulamki 20 maja 2015

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Klasy cd. Struktury Interfejsy Wyjątki

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Przeciążanie operatorów

Wstęp do Programowania potok funkcyjny

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Podstawy programowania skrót z wykładów:

5 Przygotował: mgr inż. Maciej Lasota

Wstęp do Programowania potok funkcyjny

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawy Programowania Obiektowego

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Programowanie obiektowe i C++ dla matematyków

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Programowanie obiektowe

Podział programu na moduły

Zmienne, stałe i operatory


Wstęp do Programowania potok funkcyjny

Definiowanie własnych klas

kiedy znowu uzyska sterowanie, to podejmuje obliczenie od miejsca, w którym poprzednio przerwała, i z dotychczasowymi wartościami zmiennych,

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Oracle PL/SQL. Paweł Rajba.

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Zaawansowane programowanie w C++ (PCP)

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

Metody Metody, parametry, zwracanie wartości

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Wstęp do programowania. Różne różności

Wyjątki (exceptions)

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wykład 9 Funktory (moduły sparametryzowane)

Zadanie 2: Arytmetyka symboli

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie w języku Python. Grażyna Koba

Programowanie współbieżne i rozproszone

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Szablony funkcji i szablony klas

Semantyka i Weryfikacja Programów - Laboratorium 3

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Java Język programowania

Programowanie obiektowe i C++ dla matematyków

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Programowanie obiektowe - 1.

Delphi Laboratorium 3

Tabela wewnętrzna - definicja

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Programowanie Funkcyjne. Marcin Kubica Świder,

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Wstęp do Programowania potok funkcyjny

PHP 5 język obiektowy

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Programowanie w języku C++ Grażyna Koba

Typy, klasy typów, składnie w funkcji

KLASY cz4. Dorota Pylak. destruktory składowe statyczne przeciążanie operatorów. wskaźniki

Wstęp do Programowania 2

Typy sparametryzowane

Architektura Systemu. Architektura systemu umożliwia kontrolowanie iteracyjnego i przyrostowego procesu tworzenia systemu.

Pakiety i interfejsy. Tomasz Borzyszkowski

Wstęp do Programowania, laboratorium 02

Oracle PL/SQL. Paweł Rajba.

1 Podstawy c++ w pigułce.

Semantyka i Weryfikacja Programów - Laboratorium 3

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wzorce projektowe. dr inż. Marcin Pietroo

Interfejsy i klasy wewnętrzne

Wyrażenie nawiasowe. Wyrażenie puste jest poprawnym wyrażeniem nawiasowym.

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Paradygmaty programowania

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Programowanie obiektowe

Pakiety podprogramów Dynamiczny SQL

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Transkrypt:

Wstęp do Programowania potok funkcyjny Marcin Kubica 2016/2017

Outline Moduły i bariery abstrakcji 1 Moduły i bariery abstrakcji

Moduły co to jest i po co to jest? Duży system dzielimy na mniejsze, łatwiejsze do ogarnięcia składowe moduły. Zależności między modułami powinny być ograniczone do minimum. System może być zbyt złożony, żeby ogarnąć go całego. Możemy jednak ogarnąć jeden moduł i to od czego on zleży. Interfejs modułu, to zestaw pojęć programistycznych, które moduł realizuje. Jedne moduły mogą korzystać z pojęć zaimplementowanych przez inne. Moduł to fragment programu polegający na wykonaniu wyodrębnionego zadania programistycznego. Sformułowaniu tego zadania programistycznego towarzyszy (mniej lub bardziej formalna) specyfikacja pojęć implementowanych przez moduł.

Niezależność modułów Po podzieleniu programu na moduły i wyspecyfikowaniu interfejsów, można je niezależnie implementować. W Ocamlu osobno definiujemy interfejsy i implementacje modułów. Interfejsy nazywamy sygnaturami, a implementacje strukturami. Sygnatury i struktury są bytami niezależnymi. Można je niezależnie kompilować. Moduły można niezależnie kompilować. Wszystkie informacje konieczne do skompilowania modułu są zawarte w interfejsach wykorzystywanych przez niego modułów.

Moduły na poziomie plików Definition (Struktura) TODO: struct... end. Implementacja (struktura): definicje umieszczone w pliku *.ml Interfejs (sygnatura): deklaracje umieszczone w pliku *.mli

Struktury Moduły i bariery abstrakcji Definition (Struktura) Struktura to nazwany zestaw definicji pojęć otoczonych słowami struct... end. definicja ::= struktura ::= module Identyfikator = struktura struct { definicja } end Wszystkie zdefiniowane wewnątrz pojęcia są w pełni widoczne.

Struktury Moduły i bariery abstrakcji Definition (Nazwy kwalifikowane) Do wnętrza struktury możemy dostać się stosując nazwy kwalifikowane: identyfikator ::= Identyfikator. identyfikator Można też otworzyć strukturę wyłuskać z niej wszystkie udostępniane przez nią pojęcia tak, aby były dostępne bez kwalifikowania: jednostka kompilacji ::= open Identyfikator

Struktury Moduły i bariery abstrakcji Example module Modulik = struct type typik = int list let lista = [2; 3; 7] let rec prod l = if l = [] then 1 else hd l * prod (tl l) end;; Modulik.prod Modulik.lista;; open Modulik;; prod lista;; module Pusty = struct end;;

Struktury Moduły i bariery abstrakcji Example Struktury mogą zawierać wewnątrz struktury lokalne. (Sensowne zastosowania zobaczymy później.) module M = struct module A = struct let a = 27 end module B = struct let b = 15 end end;; M.A.a + M.B.b;;

Struktury Moduły i bariery abstrakcji Definition Struktury można rozszerzać. Definiując jedną strukturę można wciągnąć do niej zawartość innej struktury. definicja ::= include Identyfikator Example module Mod = struct include Modulik let n = List.length lista end;;

Struktury Moduły i bariery abstrakcji Definition Struktury można rozszerzać. Definiując jedną strukturę można wciągnąć do niej zawartość innej struktury. definicja ::= include Identyfikator Example module Mod = struct include Modulik let n = List.length lista end;;

Sygnatury Moduły i bariery abstrakcji Sygnatura określa, które elementy struktury mają być widoczne na zewnątrz. Wszystko czego nie widać w sygnaturze jest ukryte. Sygnatura może zawierać deklaracje: wartości, z podaniem typu wartości, typu wraz z jego definicją, typu abstrakcyjnego (bez podania definicji), sygnatury lokalnej wyjątków.

Sygnatury Moduły i bariery abstrakcji Definition Składnia definicji sygnatur: definicja ::= module type Identyfikator = sygnatura sygnatura ::= sig { deklaracja } end deklaracja ::= type { parametr typowy } identyfikator [ = typ ] val identyfikator : typ module type Identyfikator = sygnatura exception wariant

Sygnatury Moduły i bariery abstrakcji Example Przykład sygnatury: module type S = sig type abstrakcyjny type konkretny = int * float val x : abstrakcyjny * konkretny module type Pusty = sig end exception Wyjatek of abstrakcyjny end;;

Sygnatury Moduły i bariery abstrakcji Example Sygnatura kolejek FIFO: module type FIFO = sig exception EmptyQueue type a queue val empty : a queue val insert : a queue -> a -> a queue val front : a queue -> a val remove : a queue -> a queue end;;

Sygnatury Moduły i bariery abstrakcji Definition Sygnatury można rozszerzać. Definiując jedną sygnaturę można wciągnąć do niej zawartość innej sygnatury. deklaracja ::= include Identyfikator

Sygnatury Moduły i bariery abstrakcji Example Sygnatura kolejek dwustronnych: module type QUEUE = sig include FIFO val back : a queue -> a val insert_front : a queue -> a -> a queue val remove_back : a queue -> a queue end;;

Sygnatury Moduły i bariery abstrakcji Definition Sygnatury można ukonkretniać. Jeżeli sygnatura zawiera typ abstrakcyjny, to można podać jaka ma być jego implementacja. sygnatura ::= sygnatura with type { parametr typowy } identyfikator = typ... Example module type LIST = FIFO with type a queue = a list;;

Łączenie struktur i sygnatur Definition Podając sygnaturę dla struktury ograniczamy wgląd do jej środka. Można to zrobić na kilka sposobów: definicja ::= module Identyfikator [ : sygnatura ] = struktura struktura ::= struktura : sygnatura struktura ::= Identyfikator... sygnatura ::= Identyfikator...

Łączenie struktur i sygnatur Example Różne sposoby łączenia struktury i sygnatury: module Fifo_implementation = struct exception EmptyQueue type a queue = a list let empty = [] let insert q x = q @ [x] let front q =... let remove q =... end;; module Fifo : FIFO = Fifo_implementation;; module Fifo = (Fifo_implementation : FIFO);; module Fifo : sig... end = struct...end;;

Moduły zasady tworzenia Black-box approach moduł ma charakter czarnej skrzynki, na zewnątrz widoczne jest tylko to, co tworzy interfejs. Information hiding sposób implementacji elementów interfejsu, jak i ew. pojęcia pomocnicze są ukryte wewnątrz modułu.

Moduły zasady tworzenia Separation of concerns specyfikacja nie powinna odwoływać się do sposobu implementacji modułu, a jedynie do takich jego właściwości, które może zaobserwować użytkownik. Podobnie, użytkownik nie powinien zakładać nic, co nie wynika ze specyfikacji. Sekret modułu to coś, czego sposób implementacji jest ukryty wewnątrz modułu. Często sekretem modułu jest struktura danych wraz z operacjami na niej.

Moduły zasady tworzenia Jak sprawdzić czy podział na moduły jest właściwy? Eksperyment myślowy: potencjalne zmiany w programie, jakich modułów dotyczy każda zmiana, bardziej lokalne zmiany, to lepszy podział na moduły.

Wartości abstrakcyjne i konkretne

Wartości abstrakcyjne i konkretne Tworząc strukturę danych musimy podjąć kilka decyzji projektowych: interfejs operacje udostępniane użytkownikowi struktury danych, wartości abstrakcyjne zbiór wartości, które chcemy reprezentować, wartości konkretne struktura danych odpowiednia do reprezentowania wartości abstrakcyjnych: typ danych, niezmiennik struktury danych wartości, które są poprawne, funkcja abstrakcji przekształca wartości konkretne w odpowiadające wartości abstrakcyjne.

Moduły i bariery abstrakcji Wartości abstrakcyjne i konkretne wartość abstrakcyjna przed operacja wartość abstrakcyjna po funkcja abstrakcji bariera abstrakcji funkcja abstrakcji wartość konkretna przed operacja wartość konkretna po

Konstruktory, selektory, modyfikatory Operacje tworzące interfejs możemy podzielić na trzy kategorie: konstruktory tworzą złożone wartości z prostszych, selektory wyłuskują elementy lub badają cechy złożonych wartości, modyfikatory przekształcają złożone wartości. Dodatkowa bariera abstrakcji odpowiednio dobrane konstruktory i selektory, Implementacja modyfikatorów nie zależy od implementacji struktury danych. Kryterium lokalności zmian im mniejsze fragmenty kodu są wrażliwe na potencjalne zmiany, tym lepiej.

Bariery abstrakcji Moduły i bariery abstrakcji Bariery abstrakcji oddzielają różne poziomy abstrakcji: programy korzystające ze złożonej struktury danych implementacja modyfikatorów implementacja struktury danych realizacja typów w języku programowania i wykorzystywane struktury danych modyfikatory konstruktory i selektory prostsze typy i operacje na nich

Example module type ULAMKI = sig type t (* typ abstrakcyjny reprezentujący ułamki *) val ulamek : int -> int -> t (* konstruktor, ulamek l m tworzy ułamek l m przy założeniu, że m 0 *) val licznik : t -> int (* selektor, zwraca licznik ułamka *) val mianownik : t -> int (* selektor, zwraca mianownik ułamka *) end;;

Example Specyfikacja: l,m N,m 0 licznik (ulamek l m) mianownik (ulamek l m) = l m Implementację struktury danych odkładamy na chwilę module Ulamki : ULAMKI = struct end.

Example module type RAT = sig include ULAMKI val rowne : t -> t -> bool (* porównanie *) val plus : t -> t -> t (* suma *) val minus : t -> t -> t (* różnica *) val razy : t -> t -> t (* iloczyn *) val podziel : t -> t -> t (* iloraz *) end;;

Example Modyfikatory i porównywanie możemy zaimplementować korzystając z następujących tożsamości: l 1 m 1 + l 2 m 2 = l 1m 2 +l 2 m 1 m 1 m 2 l 1 m 1 l 2 m 2 = l 1m 2 l 2 m 1 m 1 m 2 l 1 m 1 l2 m 2 = l 1l 2 m 1 m 2 l 1 /m 1 l 2 /m 2 = l 1m 2 l 2 m 1 dla l 2 0 l 1 m 1 = l 2 m 2 l 1 m 2 = l 2 m 1 dla m 1 0 i m 2 0

Example Implementacja modyfikatorów: module Rat : RAT = struct include Ulamki let plus x y =... let minus x y =... let razy x y =... let podziel x y =... let rowne x y =... end;; Nie zależy od implementacji struktury danych.

Example Implementacja struktury danych: module Ulamki : ULAMKI = struct type t = int * int let ulamek l m = (l, m) let licznik (l, _) = l let mianownik (_, m) = m end;; Niezmiennik struktury danych (l, m): m 0, Funkcja abstrakcji f (l, m) = l m.

Example Zmiana reprezentacji liczb wymiernych: Ułamki pamiętamy w postaci skróconych par (licznik, mianownik), Nie wymagamy normalizacji znaku (mianownika), Niezmiennik danych (l, m): m 0 nwd(l, m) = 1, Funkcja abstrakcji bez zmian (nadal nie jest różnowartościowa).

Example module Ulamki : ULAMKI = struct type t = int * int let ulamek l m = let r = nwd l m in ((l / r), (m / r)) let licznik (l, _) = l let mianownik (_, m) = m end;; Modyfikatory nie wymagają jakichkolwiek zmian.

Deser Moduły i bariery abstrakcji http://xkcd.com/303/