FP vs OOP? Mikołaj Fejzer

Podobne dokumenty
Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

Scala - programowanie obiektowo-funkcyjne

Programowanie w języku Swift : Big Nerd Ranch guide / Matthew Mathias, John Gallagher. Gliwice, cop Spis treści

Szablony funkcji i klas (templates)

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

Scala. Obiektowo-funkcyjny język programowania. Zbyszek Skowron

Programowanie. Lista zadań nr 15. Na ćwiczenia 11, 19 i 23 czerwca 2008

Programowanie obiektowe - 1.

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Wzorce projektowe. dr inż. Marcin Pietroo

KOTLIN. Język programowania dla Androida

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

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Programowanie w języku Java WYKŁAD

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Spis treści. Wprowadzenie 15

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Język programowania Scala + aktorzy Akka

C# 6.0 : kompletny przewodnik dla praktyków / Mark Michaelis, Eric Lippert. Gliwice, cop Spis treści

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Paradygmaty programowania

Wstęp do Programowania potok funkcyjny

Obiektowy Caml. Paweł Boguszewski

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.


wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

- nawiasy kwadratowe oznaczają, że to lista

Programowanie obiektowe

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Definicje klas i obiektów. Tomasz Borzyszkowski

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Szablony klas, zastosowanie szablonów w programach

Zaawansowane programowanie obiektowe - wykład 5

SWIFT. Zaawansowane Programowanie Obiektowe

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Szablony funkcji i szablony klas

Programowanie obiektowe

Technologie cyfrowe semestr letni 2018/2019

Programowanie i projektowanie obiektowe

Abstrakcyjny typ danych

Wstęp do ruby dla programistów javy

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

Programowanie Funkcyjne. Marcin Kubica Świder,

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Język C++ Programowanie obiektowe

Programowanie obiektowe W1 Wprowadzenie. Dr hab. inż. Lucyna Leniowska, prof. UR Zakład Mechatroniki, Automatyki i Optoelektroniki

C++ Przeładowanie operatorów i wzorce w klasach

Style programowania - krótki przeglad

Podstawy Programowania Obiektowego

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

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Technologia Programowania 2016/2017 Wykład 4

Programowanie obiektowe

Programowanie funkcjonalne

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

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

Efekty uboczne błędów

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

Wstęp do Programowania potok funkcyjny

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

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

Projektowanie oprogramowania: wzorce architektoniczne i projektowe

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

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Typy sparametryzowane


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

Programowanie obiektowe. Wykład 5. C++: szablony

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

Wprowadzenie do Objective-C

Szablony. Szablony funkcji

Polimorfizm. dr Jarosław Skaruz

Wykład 0 Informacje Podstawowe

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Wstęp do programowania obiektowego, wykład 7

Wykład 7 Porównanie programowania funkcyjnego i imperatywnego

Algorytmy i Struktury Danych. Anna Paszyńska

Wprowadzenie do szablonów klas

Programowanie i projektowanie obiektowe

Projektowanie obiektowe. Roman Simiński Polimorfizm

Programowanie Obiektowe i C++

Klasy abstrakcyjne i interfejsy

Programowanie w języku C++ Podstawowe paradygmaty programowania

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Programowanie obiektowe

Polimorfizm a klasy generyczne w języku Java. Zdzisław Spławski 1

Podstawy Języka Java

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Post-relacyjne bazy danych

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny) stacjonarne (stacjonarne / niestacjonarne)

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Transkrypt:

FP vs OOP? Mikołaj Fejzer

Versus? http://roflcopter.pl/4591

Versus OOP Kapsułkowanie Hierarhia klas, dziedziczenie Zmiana stanu w czasie Polimorfizm podtypu FP Funkcje jako typy pierwszego rzędu Algebraiczne struktury danych Brak efektów ubocznych Polimorfizm parametryczny

The limits of my language mean the limits of my world. L. Wittgenstein Język programowania jest zawsze ograniczony przez jego twórców Użytkownicy tworzą dobrą praktykę i tworzą struktury/klasy/mechanizmy w podobny sposób Pojawiają się wzorce projektowe Czy to jest jeszcze wzorzec projektowy? Iterator, Observer Builder Visitor, Strategy

Trochę teorii o typach Po co istnieją typy? Kompilator odgadnie o co nam chodzi wygeneruje testy sprawdzi kontrakty Możemy na nich wykonywać działania, i używać rezultatu jako typu System F oraz system typów Hindleya Milnera Podstawa dla kilku funkcyjnych języków programowania (Haskell, F#, Idris) Daje możliwość dedukcji typu przy zachowaniu silnego i statycznego typowania

Funkcja jako wartość

Kompozycja funkcji -- Function composition. {-# INLINE (.) #-} -- Make sure it has TWO args only on the left, so that it inlines -- when applied to two functions, even if there is no final argument (.) :: (b -> c) -> (a -> b) -> a -> c (.) f g = \x -> f (g x) http://hackage.haskell.org/package/base-4.3.1.0/docs/src/ghc-base.html

Co można zrobić z funkcją? Złożyć z inną funkcją Wykonać na argumentach Wykonać na argumentach w sparametryzowanym typie Umieścić w sparametryzowanym typie Kombinacje powyższych Co to jest sparametryzowany typ? Jakie może mieć właściwości?

Functor Definicja Prawa class Functor f where fmap id = id fmap :: (a -> b) -> f a -> f b fmap (p. q) = (fmap p). (fmap q) Przykład instancji instance Functor (Either a) where fmap _ (Left x) = Left x fmap f (Right y) = Right (f y)

Applicative Definicja class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b (*>) :: f a -> f b -> f b Prawa pure id <*> v = v pure (.) <*> u <*> v <*> w = u <*> (v <*> w) pure f <*> pure x = pure (f x) u <*> pure y = pure ($ y) <*> u (<*) :: f a -> f b -> f a (<$>) :: f => (a -> b) -> f a -> f b

Typy a klasy typów Funkcje generyczne działają na klasach typów Możemy pokazać dany typ jest instancją jakiejś klasy typów Nie musimy tego robić przy deklaracji typu Typ zyskuje w ten sposób właściwości i funkcje na których działamy

Funkcje a efekty uboczne i świat zewnętzny Typy sparametryzowane odzwierciedlają to, co robi funkcja Czytanie z zewnątrz - Reader Pisanie nazewnątrz - Writer Oba powyższe - State Wejście wyjście - IO Strumienie danych - Source, Conduit, Sink Transakcyjna pamięć - STM

Niezmienne struktury danych

Dopasowanie do wzorca Struktura danych zawsze pamięta jak została stworzona Możemy użyć konstruktora jako mechanizmu do rozpakowania struktury Częściowo sprzeczne z kapsułkowaniem

Lenses aka soczewki Rozwiązują problem modyfikacji zagnieżdżonych i niemodyfikowalnych struktur danych Getter oraz Setter w jako jeden mechanizm Można je składać (kompozycja) w optykę

Programowanie generyczne

Polimorfizm podtypu vs parametyczny public class Animal { public void what() { System.out.println("Animal"); } } public class Cat extends Animal { public void what() { System.out.println("Cat"); } } fmap :: Functor f => (a -> b) -> f a -> f filter :: (a -> Bool) -> [a] -> [a] isright :: Either a b -> Bool fmap (filter isright) :: Functor f => f [Either a b] -> f [Either a b]

Przykłady podobieństwa w językach funkcyjnych

Haskell Quicksort quicksort [] = [] quicksort (pivot:rest) = (quicksort lesser) ++ [pivot] ++ (quicksort greater) where lesser = filter (< pivot) rest greater = filter (>= pivot) rest

F# Quicksort let rec quicksort = function [] -> [] pivot::rest -> let lesser, greater = List.partition ((>=) pivot) rest List.concat [quicksort lesser; [pivot]; quicksort greater]

Scala Quicksort def quicksort(list: List[Int]): List[Int] = list match { case Nil => Nil case pivot :: rest => { val (lesser, greater) = tail rest (_ < pivot) quicksort(lesser) ::: pivot :: quicksort(greater) } }

Różnice Klasy typów Haskell Scala Dedukcja typów Haskell F# Polimorfizm parametryczny oraz ad hoc funkcji Haskell Typy wyższych rodzajów Haskell Scala Programowanie obiektowe Scala F#

Haskell Java User Group

Java Czego brakuje do podejścia funkcyjnego? Typów oraz abstrakcji: Either Try Validation Tuple* Konwersji np Optional -> Stream Rozwijania funkcji Dopasowania wzorca Polimorfizmu ad-hoc (polimorfizm parametryczny istnieje od 1.5) Czego brakuje do podejścia obiektowego? Domieszek (Mixin) Cech (Trait) Modułów** Klas zaprzyjaźnionych

Biblioteki - co jest gdzie? Krotka (aka Tuple) Functional Java Atlassian Fugue Javaslang Suma rozłączna (aka Either) Functional Java Atlassian Fugue Javaslang Walidacja Functional Java Javaslang Dopasowanie wzorca Javaslang Memoizacja Javaslang Soczewki Functional Java Atlassian Fugue Typ IO Functional Java Typy Reader, Writer, State Functional Java Parsery kombinatoryczne Functional Java

Scala Dlaczego powstają takie biblioteki jak Scalaz czy Cats? Aby dodać brakujące typy/abstrakcje Monada nie jest wprost zdefiniowana - metody flatmap i unit przychodzą z innych abstrakcji np Traversable Aby naprawić te zaimplementowane w języku inaczej niż uważają twórcy biblioteki Czy Either powinien być stronniczy?

Czego warto się uczyć?

Hype cycle?

Podsumowanie Trendy Wzrost znaczenia skalowalności Coraz większe ilości danych Większe ilości rdzeni Powstawanie języków specyficznych dla domen Przenoszenie odpowiedzialności z programisty na framework/bibliotekę Większe znaczenie poprawności programu, nawet kosztem wydajności Co się raczej nie zdezaktualizuje Znajomość algorytmów i struktur danych Teoria typów i matematyka za nią stojąca Dziękuję za uwagę

Referencje "Functional programming with bananas, lenses, envelopes and barbed wire.", E Meijer http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html http://adit.io/posts/2013-07-22-lenses-in-pictures.html Seria artykułów What's Wrong with Java 8, Pierre-Yves Saumont https://github.com/mfejzer/tjug_26_haskell_examples https://github.com/mfejzer/tjug_26_jvm_examples