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

Podobne dokumenty
Prezentacja o Haskell u(rozdział 3 i 4)

- nawiasy kwadratowe oznaczają, że to lista

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

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

1 Podstawy c++ w pigułce.

Języki i techniki programowania Ćwiczenia 2

Składnia funkcji i Rekurencja w języku Haskell

Wprowadzenie. Organizacja pracy i środowisko programistyczne. Mirosław Ochodek

Języki programowania zasady ich tworzenia

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

Szablony funkcji i klas (templates)

Rozliczanie kosztów księgowania wg filtrów kont

1 Podstawy c++ w pigułce.

Paradygmaty programowania

MATERIAŁY DO ZAJĘĆ II

Programowanie obiektowe

HASKELL 2 R O Z D Z I A Ł 4 SKŁADNIA W FUNKCJACH R O Z D Z I A Ł 5 REKURENCJA. Learn You a Haskell for Great Good! Miran Lipovac

Podstawy Programowania C++

Język ludzki kod maszynowy

Podstawy Programowania Podstawowa składnia języka C++

Aplikacje w środowisku Java

TEMAT : KLASY DZIEDZICZENIE

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

Programowanie obiektowe

Odczyt danych z klawiatury Operatory w Javie

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

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

4. Funkcje. Przykłady

Szablony funkcji i szablony klas

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

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

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

LibreOffice Calc VBA

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

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

Metody badawcze Marta Więckowska

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

ZMIENNE. Podstawy PHP

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

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

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Zmienne, stałe i operatory

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Operatory cd. Relacyjne: ==!= < > <= >= bool b; int i =10, j =20; dzielenie całkowitych wynik jest całkowity! Łączenie tekstu: + string s = "Ala ma ";

Programowanie funkcyjne (Haskell Wprowadzenie) Kowalik Adrian

Pętle. Dodał Administrator niedziela, 14 marzec :27

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

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Laboratorium 1 - Programowanie proceduralne i obiektowe

L E X. Generator analizatorów leksykalnych

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

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

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

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

Pascal - wprowadzenie

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Podstawy programowania

lekcja 8a Gry komputerowe MasterMind

Rozdział 4 KLASY, OBIEKTY, METODY

PARADYGMATY PROGRAMOWANIA Wykład 4

Bloki anonimowe w PL/SQL

Delphi Laboratorium 3

Programowanie w języku Python. Grażyna Koba

Zadanie 2: Arytmetyka symboli

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Wyrażenie wewnątrz nawiasów jest atomem (rozpatrujemy je jako całość).

Obliczenia, zmienne. Proste działania, zmienne, rodzaje zmiennych, proste operacje i działania na zmiennych.

Programowanie obiektowe

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

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Podstawy programowania w C++

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

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

C++ wprowadzanie zmiennych

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Algorytmy i struktury danych. wykład 1

Funkcje i instrukcje języka JavaScript

Języki programowania Haskell

Interpreter - EasyCompile

Czym jest stos i sterta?

Wstęp do Programowania potok funkcyjny

Podstawy Programowania Obiektowego

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Tablice cz. I Tablice jednowymiarowe, proste operacje na tablicach

Transkrypt:

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

Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas przed ewentualnymi problemami z działaniem aplikacji w trakcie jej wykonywania.

Typy w Haskell W języku Haskelltypy są oznaczane przez nazwy rozpoczynające się od wielkiej litery. Np. Char, Bool, etc. Do sprawdzenia typu dowolnego wyrażenia w Haskell używamy polecenia :t :

Rozpoznawanie typu To czym Haskellwyróżnia się na tle innych języków to rozbudowana funkcjonalność rozpoznawania typów. Ta cecha pozwala na dużą swobodę w programowaniu ponieważ nie musimy każdorazowo jawnie wskazywać na konkretny typ żeby program zadziałał prawidłowo. Kompilator potrafi sam określić z jakim typem ma do czynienia.

Typy funkcji Ponieważ wszystkie wyrażenia w Haskell mają zdefiniowane typ także funkcje posiadają typy. Przy tworzeniu prostych funkcji nie ma potrzeby definiowania jawnego typów ponieważ jak już wspominaliśmy Haskellposiada rozbudowaną funkcjonalność rozpoznawania typów.

Funkcja bez definicji typu Rozważmy prostą funkcję pisz której zadaniem jest dopisanie do podanego wyrazu znaku wykrzyknika. Nasza funkcja będzie miała postać : pisz x = x++ "!" Wynikiem działania tej funkcji będzie :

Funkcja bez definicji typu Sprawdźmy jaki jest typ naszej funkcji pisz : Jak widać nasz funkcja posiada typ [Char] -> [Char] co oznacza mapuje typ znakowy na typ znakowy w związku z tym, że funkcja na wejściu bierze parametr typu znakowego i zwraca także parametr typu znakowego. [] w typie świadczy o tym, że mamy do czynienia z listą w tym przypadku listą znaków typu Char.

Funkcja z jawną definicją typu Ponieważ typ [Char] jest równoważny typowi String ponieważ Stringto nic innego jak lista pojedynczych znaków typu Char spróbujmy to wykorzystać to pokazania różnicy w przypadku jawnej deklaracji typu funkcji. Rozważmy funkcję pisz2 której zadaniem jest dopisanie do podanego wyrazu znaku wykrzyknika. Nasza funkcja będzie miała postać : pisz2 :: String -> String pisz2 x = x ++ "!"

Funkcja z jawną definicją typu Przy definiowaniu typów dla parametrów funkcji posługujemy się symbolem ->. Typ wartość zwracanej znajduje się na końcu definiowanych typów. Po uruchomieniu funkcji pisz2 i sprawdzeniu jej typu możemy zaobserwować, że działanie funkcji pisz2 jest identyczne jak funkcji pisz mimo iż funkcja pisz2 jest typu [String] -> [String].

Typy zmienne W Haskell mamy także dyspozycji zmienne typy czyli taką konstrukcję która nie narzuca z góry określonego typu dla parametru. Rozważmy wbudowaną funkcję head która zwraca pierwszy obiekt z listy :

Typy zmienne Jak widzimy funkcja head nie ma określonego konkretnego typu. Funkcja ta na wejściu przyjmuje listę nieokreślonego typu i zwraca pierwszy obiekt tej listy o nieokreślonym typie. Funkcje które przyjmują typy zmienny nazywamy funkcjami polimorficznymi.

Typeclasses Klasy typów Klasy typów w Haskellsą pewnego rodzaju mechanizmem określającym sposób zachowania poszczególnych typów związanych z daną klasą. Rozważmy typ funkcji porównania == : Symbol => nazwany jest w Haskellclassconstraint, czyli ograniczeniem klasy.

Typeclasses Klasy typów Tak zdeklarowany typ funkcji == oznacza, że funkcja porównania pobiera na wejściu dwie wartości tego samego typu i zwraca wartość typu Bool, gdzie obie wartości wejściowe muszą należeć do klasy typów Eq.

Podstawowe klasy typów Eq dla typów używanych w porównaniach ( ==,/= ) Ord dla typów używanych w porządkowaniu wartości ( <, >, <=, >= ) Show dla typów które mogę prezentowane jako String Num dla wszystkich typów numerycznych Integral dla typów liczb całkowitych Floating dla typów liczb zmiennoprzecinkowych Enum dla typów wyliczalnych

Składanie w funkcji Poniżej opiszemy kilka podstawowych konstrukcji składni w funkcjach dostępnych w Haskell.

Porównywanie wzorca Składnia daje możliwość tworzenia konstrukcji pozwalających na wskazywanie konkretnych wzorców, porównywanie ich z parametrami wejściowymi funkcji która posiada zaimplementowaną taką funkcjonalność ( matching ) i weryfikacji danych wejściowych względem zaimplementowanego wzorca ( data deconstructing). Składnia takiej funkcji pozwala na implementację różnych zachowań funkcji w zależności od wykorzystywanego wzorca.

Porównywanie wzorca Rozważmy konstrukcję prostej funkcji sprawdzającej czy wartością na wejściu jest liczba 1 lub 2 : checknum:: (Integrala) => a-> String checknum1 = "To jest liczba jeden" checknum2 = "To jest liczba dwa" checknumx = "To nie jest 1 lub 2"

Porównywanie wzorca Warto zaznaczyć, że weryfikacja wzorca następuje od góry do dołu ciała funkcji. Jeśli weryfikowana wartość ( w tym przypadku 1 ) pasuje do pierwszego wzorca określonego w funkcji do sprawdzenie zatrzyma się na pierwszym wzorcu i reszta nie będzie weryfikowana mimo iż teoretycznie wartość 1 pasuje także do wzorca ostatniego. Oznacza to, że gdybyśmy wzorzec checknumx = "To nie jest 1 lub 2" umieścili jako pierwszy od góry w naszej funkcji to każda liczba podana jako parametr wejściowy wyświetli To nie jest 1 lub 2.

Porównywanie wzorca Działanie funkcji checknum będzie następujące :

Porównywanie wzorca Istotnym jest aby przy budowaniu tego typu funkcji pamiętać o umieszczaniu na końcu wzorca który odpowiada za wszystkie pozostałe przypadki czyli w przypadku naszej funkcji checknumx = "To nie jest 1 lub 2". Jest to istotne zabezpieczenie naszej funkcji przed niekontrolowanym błędem wykonania.

Strażnicy Strażnik jest w Haskell mechanizmem w sowim działaniu bardzo zbliżonym do warunku if. Wynikiem działania strażników jest wartość logiczna czyli True lub False. Mimo iż funkcjonalnie strażnicy są bardzo podobni do konstrukcji if to ich implementacja zdecydowanie zwiększa czytelność kodu. Dodatkowo strażnicy bardzo dobrze współpracują z wcześniej opisanym mechanizmem porównywania wzorców.

Strażnicy Rozważmy prostą funkcję z wykorzystaniem strażników której zadaniem będzie określenie etapu życia człowieka w zależności od podanego wieku jako parametru wejściowego : checkage:: (Integrala) => a-> String checkage age age <= 18 = "Natsolatek" age<= 65 = "Dorosly" age<= 110 = "Emeryt" otherwise = "Trudno powiedziec"

Strażnicy Zauważmy, że implementacja strażnika polega na użyciu symboli następnie podaniu warunku dla strażnika oraz po znaku = podaniu wartości wyrażenia które ma zaistnieć po spełnieniu tego warunku. Tutaj podobnie jak w porównywaniu wzorców istotna jest kolejność strażników oraz zadbaniu aby na końcu takiej funkcji zawsze znajdował się warunek odpowiadający wszystkim innym możliwością od zaimplementowanych. W tym celu przy wykorzystaniu strażników posługujemy się wyrażeniem otherwise.

Strażnicy Działanie funkcji checkage będzie następujące :

Strażnicy Możemy także zastosować w naszej funkcji więcej niż jeden parametr. Rozważmy poniższą funkcję do weryfikacji BMI : bmitell weight height weight/ height^ 2 <= 18.5 = " Jestesza chudy" weight/ height^ 2 <= 25.0 = " Jest ok" weight/ height^ 2 <= 30.0 = " Trocheza duzocialka" otherwise= " Dzwon do lekarza"

Strażnicy Działanie naszej funkcji sprawdzającej indeks BMI :

Where Na przykładzie funkcji z dwoma parametrami do sprawdzania indeksu BMI można zauważyć, że powtarzamy pewną częścfunkcji a mianowicie fragment weight/ height^ 2. Takie wielokrotne powtarzanie tego samego nie jest oczekiwanym zachowaniem w programowaniu. W celu uniknięcia takich powtórzeń możemy zastosować w naszej składni wyrażenie Where nazywane w także w Haskell wiązaniem.

Where Rozważmy zmodyfikowaną o użycie wyrażenia where funkcję do sprawdzania indeksu BMI : bmitell2 :: ( RealFloata) => a-> a-> String bmitell2 weight height bmi <= 18.5 = " Jestesza chudy" bmi <= 25.0 = " Jest ok" bmi <= 30.0 = " Trocheza duzocialka" otherwise= " Dzwon do lekarza" wherebmi = weight/ height^ 2

Where Warunek where umieszczamy na końcu naszej listy zdefiniowanych strażników. Dzięki wykorzystaniu tego wyrażenia nasz kod staje się dużo bardziej czytelny przy zachowaniu tej samej funkcjonalności :

Let Wyrażenie let w kontekście wykorzystania w funkcjach ze strażnikami jest w swoim działaniu bardzo podobne do wyrażenia where i także jest określany w języku Haskell mianem wiązania. Różnica między let a where polega na tym, że let działa bardziej lokalnie, tj. nie obejmuje zakresem swojego działania całego strażnika. W skrócie działania wyrażenia let polega na przypisaniu pewnych wartości do podanych zmiennych.

Let