- nawiasy kwadratowe oznaczają, że to lista

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

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

Języki i Paradygmaty Programowania

1 Podstawy c++ w pigułce.

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

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

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Tablice (jedno i wielowymiarowe), łańcuchy znaków

1 Podstawy c++ w pigułce.

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

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

KOTLIN. Język programowania dla Androida

Podstawowe części projektu w Javie

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

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

Programowanie funkcyjne (Haskell Wprowadzenie) Kowalik Adrian

Paradygmaty programowania

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

Składnia funkcji i Rekurencja w języku Haskell

Warunek wielokrotnego wyboru switch... case

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

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

Język ludzki kod maszynowy

Programowanie Komputerów

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

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

Wprowadzenie do języka Java

Podstawy Programowania C++

Powtórka algorytmów. Wprowadzenie do języka Java.

Powtórka algorytmów. Wprowadzenie do języka Java.

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

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

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Wstęp do programowania

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

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

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

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

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

Wstęp do Programowania, laboratorium 02

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

Delphi Laboratorium 3

Paradygmaty programowania

MATERIAŁY DO ZAJĘĆ II

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Programowanie strukturalne i obiektowe. Funkcje

Wykład 2 Składnia języka C# (cz. 1)

Część 4 życie programu

Szablony funkcji i klas (templates)

Wstęp do programowania

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

4. Funkcje. Przykłady

Oczywiście plik musi mieć rozszerzenie *.php

Wstęp do Programowania potok funkcyjny

Programowanie obiektowe

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Definicje wyższego poziomu

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

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

Interpreter - EasyCompile

Wykład 4: Klasy i Metody

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

I - Microsoft Visual Studio C++

Programowanie w języku Python. Grażyna Koba

Programowanie obiektowe zastosowanie języka Java SE

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Elementy języka Haskell

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

SWIFT. Zaawansowane Programowanie Obiektowe

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Microsoft IT Academy kurs programowania

Tworzenie aplikacji w języku Java

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

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

2 Przygotował: mgr inż. Maciej Lasota

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

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

ZMIENNE. Podstawy PHP

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

System operacyjny Linux

Typy danych, zmienne i tablice. Tomasz Borzyszkowski

Algorytmika i Programowanie VBA 1 - podstawy

Podstawy programowania w C++

Programowanie Obiektowe i C++

Java Język programowania

Szablony. Szablony funkcji

Języki programowania Haskell

Transkrypt:

Haskell jest statycznym typem języka: - wszystkie typy i wyrażenia są znane w czasie kompilacji ( zwiększa to bezpieczeństwo kodu). Podawanie typów zmiennych i argumentów funkcji jest zbędne, gdyż Haskel wywnioskuje to z kontekstu. Nazwy wszystkich typów zaczynają się dużą literą. - nawiasy kwadratowe oznaczają, że to lista

Aby stworzyć funkcję musimy ją zapisać w pliku nazwa_pliku.hs. Jeżeli rozszerzenie pliku będzie inne niż.hs wyświetli nam się taki komunikat: target nazwa_pliku.a is not a module name or a source file Plik kompilujemy: ghci> :l nazwa_pliku.hs ghci> :l nazwa_pliku ghci> :load nazwa_pliku.hs ghci> :load nazwa_pliku

W funkcjach powinniśmy deklarować jakiego typu są argumenty funkcji (nie wymagane). Parametry oddzielamy przez ->. Parametry pobierane i zwracane nie są rozróżniane. Ostatni parametr na liście w deklaracji typów określa typ zwracany przez funkcję. Jeśli nie mamy pojęcia co nasza funkcja pobiera i zwraca możemy użyć :t.

Typy całkowite Int jest to typ ograniczony całkowity. (liczba całkowita zapisywana na 32 bitach). Integer jest również typem całkowitym.(brak ograniczenia do 32 bitów). Integer pomieści znacznie większe liczby, aczkolwiek Int jest typem bardziej wydajnym.

Float - pojedyncza precyzja Double - podwójna precyzja. Inne typy Bool, Char - znaki muszą być ujęte w apostrofy

Funkcja wbudowana head pobiera i zwraca: Zmienne typy Nazwy typów zaczynają się z wielkiej litery, a więc a nie określa typu. Zapis ten oznacza, że funkcja head pobiera listę dowolnych elementów i zwraca jeden z nich (w tym przypadku akurat pierwszy). Zmienne typy w Haskell-u są tym czym są typy generyczne w innych językach. Funkcje zawierające zmienne typy są nazywane funkcjami polimorficznymi. Zmienne tych funkcji mogą posiadać zmienne o nazwach dłuższych niż jednoliterowe, ale przyjęło się, że używa się właśnie nazw o długości jednej litery.

Zmienne typy funkcja fst: pobiera dwuelementową krotkę i zwraca element który jest tego samego typu co pierwszy element krotki. Elemeny a i b nie musza być tego samego typu.

W Haskell operatory ==, +, *, -, / i wiele innych to funkcje. Jeżeli funkcja zawiera jedynie znaki specjalne, domyślnie jest funkcją infiksową. Jeżeli chcemy sprawdzić na jakich typach pracuje musimy przekazać ją do innej funkcji lub uczynić tę funkcję prefiksową czyli musimy nazwę tej funkcji zawrzeć w nawiasach. Wszystko co występuje przed symbolem => nazywane jest klasą ograniczeń. W przypadku funkcji == możemy to oczytać jako: funkcja równości pobiera dwa elementy tego samego typu należące do klasy obiektów (typeclass) Eq i zwraca typ Bool. Typeclass -rodzaj interfejsu definiującego pewne zachowania. Jeżeli typ jest częścią typeclass oznacza to, że ma zaimplementowane pewne zachowania, które opisuje typeclass. Nie jest tym samym co klasa w językach zorientowanych obiektowo. Przypomina raczej interfejsy w Java.

Typeclass Eq -udostępnia interfejs do testowania równości. Każdy typ dla którego ma sens porównanie dwóch wartości powinien należeć do klasy Eq. Standard języka Haskell wymaga by wszystkie typy i funkcje, z wyjątkiem IO, należały do klasy Eq. Dlatego możemy wykonywać takie porównania:

- jest dla typów które mają "kolejność". Typeclass Ord Funkcje porównujące >, <, >=, <= pobierają dwa argumenty tego samego typu należące do klasy Ord i zwracają obiekt klasy Ordering, tzn. GT, LT lub EQ (greater than, lesser than i equal) Aby typ należał do klasy Ord, musi należeć do klasy Eq.

Typeclass Show - klasa obiektów które mogą być zaprezentowane jako tekst. Najczęściej używaną funkcją należącą do klasy typu Show jest funkcja show. Pobiera ona wartość i wyświetla ją jako tekst. Typeclass Read Funkcją o działaniu odwrotnym do show jest funkcja read. Pobiera ona tekst i zwraca typ należący do Read.

Zdarzają się jednak czasami problemy: Wystąpił komunikat, gdyż funkcja nie wie co zwrócić. Nie zawsze kompilator może wywnioskować z kontekstu jakiego typu danych oczekuje. Należy zaznaczyć jakiego wyniku oczekujemy, by pozbyć się niechcianego błędu.

Typeclass Enum - klasa obiektów do którego należą typy, które mogą być wyliczane. W typie tym dostęp do poprzednika udostępnia funkcja pred, a do następnika funkcja succ. Typy które należą do tej klasy to: (), Bool, Char, Ordering, Int, Integer, Float i Double.

Typeclass Bounded - do tej klasy należą typy mające wartości graniczne. Funkcja minbound zwraca minimalną wartość danego typu, a funkcja maxbound zwraca maksymalną wartość danego typu. Wszystkie krotki również należą do tej klasy.

Typeclass Num -klasa której członkowie mogą zachowywać się jak liczby. Jeżeli sprawdzimy Okazuje się, że funkcja ta akceptuje wszystkie typy należące do klasy Num. Pobiera ona dwie liczby tego samego typu i zwraca liczbę tego samego typu. (5 :: Int) * (6 :: Integer) - wygeneruje błąd, ale 5 * (6 :: Integer) wykona się ponieważ 5 może działać jak Integer

- klasa obiektów należąca do klasy Num. Do Integral należą Int i Integer. Typeclass Integral - typy zmiennoprzecinkowe tzn. Float i Double. Typeclass Floating Funkcja fromintegral konwertuje typy numeryczne na typ Integral. Bardzo użyteczna funkcja jeżeli chcemy używać razem typów zmiennoprzecinkowych z typami całkowitymi.

Pierwsza linia to deklaracja funkcji. Mówi ona, że funkcja pobiera wartość całkowitą i zwraca napis. Ta konstrukcja jest równoważna ze switch znanym z innych języków. Program przechodzi przez wszystkie wszystkie linie i sprawdza zgodność. Ostatnia instrukcja jest odpowiednikiem default czyli jeżeli w poprzednich liniach komputer nie znajdzie dopasowania to zostanie wykonana ostatnia instrukcja. W Haskell każda funkcja musi zwrócić wartość.

Rekurencja. Oczywiście zamiana pierwszej części z drugą skutkowała by tym, że pierwsza linia wykonywałaby się zawsze, a druga nigdy co skutkowało by tym, że obliczenia nigdy by się nie zakończyły (powiedzmy) W rekurencji, szczegółowe warunki powinny znaleźć się na początku listy, a później bardziej ogólne.

W tym przypadku jeśli jako argument funkcji podamy h, wówczas Funkcja musi zwracać jakąś wartość, dlatego na końcu należałoby dodać instrukcję wyłapująca wszystkie możliwe wartości.

Dodajmy do siebie dwa wektory Krotki Funkcje fst i snd zwracają odpowiedni pierwszy i drugi element krotki. Niestety, nie ma funkcji zwracającej trzeci czy dalszy element krotki(można stworzyć taką funkcję),jednak lepszym rozwiązaniem będzie:

Funkcja zwracającą trzeci element krotki. Krotki _ - nie dbamy oto co jest w danym miejscu.

Tworzenie list: Operacje na listach. ghci > [1,2,3] lub ghci > 1:2:3:[] wynik będzie taki sam lista zawierająca listy: ghci > let a = (1:2:3:[]) ghci > let b = (4:5:6:[]) ghci > a:b:[] Tworzenie listy z sum elementów krotek:

Operacje na listach. Tworzenie własnej Implementacji funkcji head Sprawdzanie(działanie):

Tworzenie własnej Implementacji funkcji head Operacje na listach. Sprawdzanie(działanie): ghci> head' [] *** Exception: Can't call head on an empty list, dummy! ghci> head' [3,2,5] 3 ghci> head' "Hello" 'H'.

Operacje na listach. Tworzenie własnej Implementacji funkcji head Pojawiła nam się teraz nowa funkcja error, która pobiera łańcuch znaków i generuje błąd wykonania. Łańcuch znakowy to informacja co poszło nie tak.

Operacje na listach. Kolejna prosta funkcja, która zwróci nam dwa pierwsze elementy listy (zwraca komunikat jeśli lista jest pusta lub krótsza)

Operacje na listach. Teraz użyjemy dopasowywania wzorca i rekurencji. Jeżeli funkcja dostanie pustą listę zwraca 0. Jeżeli lista nie jest pusta jest dzielona na głowę i ogon. Ogon przekazywany jest jako argument przy wywołaniu funkcji, a do tego co funkcja zwróci dodawane jest 1 ponieważ głowa ma zawsze długość 1. We wzorcu użyliśmy _ ponieważ nie ma dla nas znaczenia co zawiera pierwszy element listy.

Operacje na listach. Tym razem będzie nas interesował pierwszy element listy. Podobna funkcja do poprzedniej, lecz teraz dodajemy głowę a nie odrzucamy ją.

Operacje na listach. W tej funkcji all to zwykła zmienna której przypisywana jest wartość wyrażenia w nawiasach. ++ to funkcja łącząca listy. X jest w nawiasie kwadratowym, ponieważ musi wystąpić zgodność typów. capital2 :: String -> String capital2 "" = "Empty string, whoops! capital2 (x:xs) = "The first letter of " ++ [x] ++ xs ++ " is " ++ [x]

Guards -jest podobny do case z C++ tylko inaczej zapisany i o poszerzonych możliwościach. (sprawdza nierówności i równości).

Inny prosty przykład: Guards można to też zapisać tak: ghci> 3 `mycompare` 2 GT Wywoływaniu funkcji wygląda tak: `nazwa`. ` - ten sam klawisz co ~

Where Where dokonuje łączenia wyrażenia ze zmienną na końcu, a zmienna jest wykorzystywana w funkcji wcześniej.

Można nadać etykiety (są to stałe) Where lub krócej:

Zdefiniowaliśmy stałe w bloku where, teraz zdefiniujemy funkcję. Do funkcji przekazywana jest lista krotek zawierających wagę i wzrost. Funkcja zwraca listę wyników bmi.

Podobne w działaniu do where jest let. Where na końcu funkcji łączy wyrażenie ze zmiennymi.(widoczne jest w całej funkcji). Let Let również łączy wyrażenie ze zmienną, ale działa bardzo lokalnie ( nie jest widoczne w całej funkcji).

Zasada działania let: let <łączenia> in <wyrażenie> Let Zmienne zdefiniowane w części łączenia są dostępne w części wyrażenia. Let dokonuje łączenia wyrażenia ze zmienną na początku, a zmienna jest wykorzystywana w funkcji później.

Let Aby użyć więcej zmiennych, należy oddzielić je średnikami Nie musimy pisać średnika za ostatnim łączeniem.

Let można umieścić wewnątrz operacji na listach Let Do let możemy również dodać predykaty. ghci> calcbmis [(26, 1)] [26.0] ghci> calcbmis [(24, 1)] [] ghci> calcbmis [(25,1),(24, 1),(30,1)] [25.0,30.0]

Można umieścić let wewnątrz operacji na listach Nie możemy użyć nazwy bmi w wyrażeniu (w, h) <- xs ponieważ bmi jest zdefiniowane w wyrażeniu let i nie jest widoczne poza let. Gdy używamy let w przetwarzaniu list pomijamy in, ponieważ widoczność nazw jest tu ograniczona. Jeżeli pominiemy in bezpośrednio GHCi nasza zmienna związana z danym wyrażeniem będzie widoczna dla całej sesji:

- wyrażenie, które prawdopodobnie można umieścić wszędzie (else jest wymagane). If ghci> [if 5 > 3 then "Woo" else "Boo", if 'a'>'b' then "Foo" else "Bar"] ["Woo","Bar"] ghci> 4 * (if 10 > 5 then 10 else 0) + 2 42

Haskell(head) Case To samo z użyciem case:

Case Wyrażenie(expression) jest porównywane ze wzorem(pattern),a gdy pasuje podawany jest wynik(result). Jednak gdy żaden wzór nie będzie pasował do wyrażenia, wówczas pojawi się błąd wykonania.

Case Wszystkie możliwe przypadki są rozwiązane w ostatniej linii. Rozwiązanie alternatywne( z użyciem where).

Koniec Autor: Tomasz Strzelecki