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

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

Wykład 9 Funktory (moduły sparametryzowane)

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Obiektowy Caml. Paweł Boguszewski

Wstęp do Programowania potok funkcyjny

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Wstęp do Programowania potok funkcyjny

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Programowanie Funkcyjne. Marcin Kubica Świder,

Wstęp do Programowania potok funkcyjny

E S - uniwersum struktury stosu

Wstęp do Programowania potok funkcyjny


ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Szablony funkcji i szablony klas

Wprowadzenie do szablonów szablony funkcji

Algorytm selekcji Hoare a. Łukasz Miemus

struct Student { char nazwisko[30]; int wiek; float ocena; }; #define MAX_ROZMIAR 3 Student lista_studentow[max_rozmiar];

Struktury danych (I): kolejka, stos itp.

Wprowadzenie do szablonów szablony funkcji

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie obiektowe

Wykład 5 Listy leniwe

Wykład 7 Porównanie programowania funkcyjnego i imperatywnego

structure foo :>PART TWO = struct exception NotImplemented datatype a tree = Leaf of a Node of a tree * a * a tree 1

Programowanie Proceduralne

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Algorytmy sortujące. sortowanie kubełkowe, sortowanie grzebieniowe

jest ciągiem elementów z przestrzeni B(R, R)

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

Definicja obiektowego modelu danych: struktura i zachowanie

Przecięcia odcinków. Wykład /07

Podstawy Programowania Obiektowego

Programowanie funkcjonalne

Wykład 11 Podtypy a dziedziczenie

Algorytmy i Struktury Danych

Algorytm. a programowanie -

Przestrzenie metryczne. Elementy Topologii. Zjazd 2. Elementy Topologii

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Java Collections Framework

Algorytmy i Struktury Danych, 2. ćwiczenia

Grupowanie Witold Andrzejewski, Politechnika Poznańska, Wydział Informatyki 201/633

Wstęp do programowania. Stosy i kolejki. Piotr Chrząstowski-Wachtel

Terminarz rozgrywek Ekstraklasy w sezonie 2016/2017

Wstęp do programowania

Metodyki zwinne wytwarzania oprogramowania

Algorytmy funkcjonalne i struktury danych

Wprowadzenie do UML, przykład użycia kolizja

Kurs programowania. Wykład 9. Wojciech Macyna

Języki i Paradygmaty Programowania

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Składnia funkcji i Rekurencja w języku Haskell

Wstęp do programowania

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

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

Weronika Siwek, Metryki i topologie 1. (ρ(x, y) = 0 x = y) (ρ(x, y) = ρ(y, x))

XQuery. XQuery. Przykład. dokument XML. XQuery (XML Query Language) XQuery 1.0: An XML Query Language. W3C Recommendation

Semantyka i Weryfikacja Programów - Laboratorium 3

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie Funkcyjne. Prezentacja projektu, 7 stycznia 2008, Juliusz Sompolski

Robert Kawulak C++09. Co nowego w nadchodzącym standardzie języka?

ALGORYTMY I STRUKTURY DANYCH

Diagramy UML, przykład problemu kolizji

Sztuczna Inteligencja i Systemy Doradcze

Programowanie obiektowe

Język ludzki kod maszynowy

#include <iostream.h> #include <conio.h>

Wstęp do programowania

Strategia "dziel i zwyciężaj"

Jerzy Nawrocki, Wprowadzenie do informatyki

Wykład 6. Metoda eliminacji Gaussa: Eliminacja z wyborem częściowym Eliminacja z wyborem pełnym

Algorytmy i Struktury Danych.

Liczbowe funkcje rekurencyjne wielu zmiennych uczymy się na błędach

Proste algorytmy w języku C

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

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

Elementy języka Haskell

Programowanie obiektowe

Wydajność użycia funktorów z biblioteką STL języka C++

Programowanie MorphX Ax

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

Zdzisław Dzedzej. Politechnika Gdańska. Gdańsk, 2013

Algorytmy i Struktury Danych.

Wstęp do programowania

Programowanie obiektowe

KARTA KURSU. Algorytmy, struktury danych i techniki programowania. Algorithms, Data Structures and Programming Techniques

Transkrypt:

Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011

Outline Funktory 1 Funktory

Intuicje Funktory Intuicje Funktory to moduły sparametryzowane (innymi modułami). Wykorzystywanie jednych modułów przez inne: tradycyjne: moduł korzysta z konkretnych innych modułów, funktory: moduł korzysta z modułów zapewniających określone interfejsy, moduły o tych interfejsach stają się parametrami funktora. Interfejs = specyfikacja Information hiding okeślamy co mają dostarczać wykorzystywane moduły, a nie które konkretnie to są moduły. Separation of concerns: specyfikacja, implementacja, sposób łączenia modułów. Funktory = funkcje na strukturach. Szablony (ang. templates) i dużo więcej...

Składnia funktorów Funktory Definition sygnatura ::= functor ( Identyfikator : sygnatura ) -> sygnatura... struktura ::= functor ( Identyfikator : sygnatura ) -> struktura struktura ( struktura )... definicja ::= module Identyfikator ( Identyfikator : sygnatura ) [ : sygnatura ] = struktura...

Pojęcie przestrzeni metrycznej Definition Przestrzeń metryczna, to zbiór punktów X, wraz z metryką d : X X [0; ) określającą odległości między punktami. Metryka musi spełniać następujące warunki: d(a, b) = 0 a = b, d(a, b) = d(b, a), d(a, b) + d(b, c) d(a, c), dla dowolnych a, b, c X.

Przestrzenie metryczne Funktory Przykłady metryk na płaszczyźnie R 2 : metyryka euklidesowa: d 2 ((x 1, y 1 ), (x 2, y 2 )) = metyryka miejska (Manhattan): (x 1 x 2 ) 2 + (y 1 y 2 ) 2 d 1 ((x 1, y 1 ), (x 2, y 2 )) = x 1 x 2 + y 1 y 2 metyryka maksimum: d ((x 1, y 1 ), (x 2, y 2 )) = max( x 1 x 2, y 1 y 2 )

Zdziwienia dnia Funktory Zdziwienia dnia Jaki kształt mają okręgi w tych metrykach? Na płaszczyźnie metryki d 1 i d tworzą przestrzenie izomorficzne. Podaj przekształcenie układu współrzędnych, które przekształca jedną przestrzeń w drugą. Czy przestrzenie metryczne z metrykami d 1 i d też są izomorficzne? Jaki kształt mają sfery w tych przestrzeniach?

Przestrzenie metryczne Funktory Zaimplementujmy pojęcie przestrzeni metrycznej oraz opisane trzy przestrzenie metryczne. module type METRIC_SPACE = sig type t val d: t -> t -> float module Euclidian_Plane : METRIC_SPACE = struct type t = float * float let square x = x *. x let d (x1, y1) (x2, y2) = sqrt (square (x1 -. x2) +. square (y1 -. y2))

Przestrzenie metryczne Funktory module Manhattan_Plane : METRIC_SPACE = struct type t = float * float let d (x1, y1) (x2, y2) = abs_float (x1 -. x2) +. abs_float (y1 -. y2) module Max_Plane : METRIC_SPACE = struct type t = float * float let d (x1, y1) (x2, y2) = max (abs_float (x1 -. x2)) (abs_float (y1 -. y2))

Produkt przestrzeni metrycznych Funktor produktu kartezjańskiego przestrzeni metrycznych. Różne sposoby składania metryk: module Manhattan_Product (S1 : METRIC_SPACE) (S2 : METRIC_SPACE) : METRIC_SPACE = struct type t = S1.t * S2.t let d (x1, y1) (x2, y2) = S1.d x1 x2 +. S2.d y1 y2

Produkt przestrzeni metrycznych module Euclidian_Product (S1 : METRIC_SPACE) (S2 : METRIC_SPACE) : METRIC_SPACE = struct type t = S1.t * S2.t let square x = x *. x let d (x1, y1) (x2, y2) = sqrt (square (S1.d x1 x2) +. square (S2.d y1 y2)) module Max_Product (S1 : METRIC_SPACE) (S2 : METRIC_SPACE) : METRIC_SPACE = struct type t = S1.t * S2.t let d (x1, y1) (x2, y2) = max (S1.d x1 x2) (S2.d y1 y2)

Produkt przestrzeni metrycznych R z metryką : module Line : METRIC_SPACE = struct type t = float let d x y = abs_float (x -. y)

Produkt przestrzeni metrycznych Alternatywna definicja trzech przestrzeni metrycznych na płaszczyźnie: module Manhattan_Plane = Manhattan_Product (Line) (Line);; module Euclidian_Plane = Euclidian_Product (Line) (Line);; module Max_Plane = Max_Product (Line) (Line);;

Kolejka priorytetowa Funktory Kolejka priorytetowa może być sparametryzowana porządkiem liniowym określonym na elementach. Porządek taki ma sygnaturę: type porownanie = Mniejsze Rowne Wieksze;; module type PORZADEK_LINIOWY = sig type t val porownaj : t -> t -> porownanie

Sygnatura kolejki priorytetowej module type PRI_QUEUE_FUNC = functor (Elem : PORZADEK_LINIOWY) -> sig exception EmptyQueue type elem = Elem.t type queue val empty : queue val is_empty : queue -> bool val put : elem -> queue -> queue val getmax : queue -> elem val removemax : queue -> queue Typ queue jest abstrakcyjny, a elem konkretny. Cokolwiek będzie wiadome o Elem.t będzie też wiadome o elem. Inaczej nie można włożyć żadnego konkretnego elementu do kolejki.

Sygnatura kolejki priorytetowej module type PRI_QUEUE_FUNC = functor (Elem : PORZADEK_LINIOWY) -> sig exception EmptyQueue type elem = Elem.t type queue val empty : queue val is_empty : queue -> bool val put : elem -> queue -> queue val getmax : queue -> elem val removemax : queue -> queue Typ queue jest abstrakcyjny, a elem konkretny. Cokolwiek będzie wiadome o Elem.t będzie też wiadome o elem. Inaczej nie można włożyć żadnego konkretnego elementu do kolejki.

Implementacja listowa kolejki priorytetowej module PriQueue : PRI_QUEUE_FUNC = functor (Elem : PORZADEK_LINIOWY) -> struct type elem = Elem.t exception EmptyQueue type queue = elem list let empty = [] let is_empty q = q=empty let rec put x q = if q = [] then [x] else if Elem.porownaj x (hd q) = Wieksze then x::q else (hd q)::(put x (tl q)) let getmax q = if q=[] then raise EmptyQueue else hd q let removemax (q:queue) = if q=[] then raise EmptyQueue else tl q

Kolejka priorytetowa liczb całkowitych module IntOrder = struct type t = int let porownaj (x:int) (y:int) = if x < y then Mniejsze else if x > y then Wieksze else Rowne module IntQueue = PriQueue (IntOrder);; IntOrder.t jest typem konkretnym. Dzięki temu wiadomo, że elementy kolejki IntQueue są typu int.

Sortowanie sparametryzowane porządkiem liniowym Porządek liniowy określa kolejność sortowania: module type SORTING = functor (Elem : PORZADEK_LINIOWY) -> sig type elem = Elem.t val sortuj : elem list -> elem list

Heap-Sort Funktory Jednym z algorytmów sortowania jest heap-sort: module HeapSort (PrQ : PRI_QUEUE_FUNC): SORTING = functor (Elem : PORZADEK_LINIOWY) -> struct type elem = Elem.t module PQ = PrQ (Elem) open PQ let wkladaj l = List.fold_left (fun h x -> put x h) empty l let rec wyjmuj q a = if is_empty q then a else wyjmuj (removemax q) (getmax q :: a) let sortuj l = wyjmuj (wkladaj l) []

Złożenie funktorów Funktory module Sortowanie = HeapSort (PriQueue);; module S = Sortowanie (IntOrder);; S.sortuj [1;7;3;6;5;2;4;8];; - : S.elem list = [1; 2; 3; 4; 5; 6; 7; 8] Zapisując moduły w postaci funktorów, tworzymy łatwo wymienne elementy.

= parametry lub wynik są funktorami. Mediana: wybór środkowego (w porządku) elementu: module type MEDIANA = functor (Elem : PORZADEK_LINIOWY) -> sig type elem = Elem.t exception PustaLista val mediana : elem list -> elem Rozwiązanie: użyjmy sortowania. Potrzebujemy: porządku liniowego i algorytmu sortowania.

module Mediana : functor (Sort : SORTING) -> MEDIANA = functor (Sort : SORTING) -> functor (Elem : PORZADEK_LINIOWY) -> struct type elem = Elem.t exception PustaLista module S = Sort (Elem) let mediana l = let s = S.sortuj l and n = List.length l in if n = 0 then raise PustaLista else List.nth s (n / 2)

Mediana to funktor wyższego rzędu. module M = Mediana (HeapSort (PriQueue)) (IntOrder);; M.mediana [4;3;5;6;2;1;7];; - : M.elem = 4