Nazwa pochodzi od imienia znanego logika Haskell a Brooks a Curry ego ( )

Podobne dokumenty
Programowanie funkcyjne (Haskell Wprowadzenie) Kowalik Adrian

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Podstawy programowania funkcjonalnego

Wstęp do programowania

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Wstęp do programowania

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

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

Podstawy programowania w języku C i C++

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

Środowisko R wprowadzenie. Wykład R1; Pakiety statystyczne

Python jest interpreterem poleceń. Mamy dwie możliwości wydawania owych poleceń:

Pobieranie argumentów wiersza polecenia

Operatory w C++ Operatory arytmetyczne. Operatory relacyjne (porównania) Operatory logiczne. + dodawanie - odejmowanie * mnożenie / dzielenie % modulo

Podstawy programowania w Pythonie

W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

SKRYPTY. Zadanie: Wyznaczyć wartość wyrażenia arytmetycznego

Języki i Paradygmaty Programowania

Programowanie w logice

Algorytmika i Programowanie VBA 1 - podstawy

Wstęp do Programowania Lista 1

Wstęp do programowania

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

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Deklaracje. W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Programowanie Komputerów

Wprowadzenie do psql i SQL. Język komend psql. Podstawy instrukcji SELECT

Języki programowania zasady ich tworzenia

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Podstawowe operacje na macierzach, operacje we/wy

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Semantyka i Weryfikacja Programów - Laboratorium 6

Wstęp do Informatyki i Programowania Laboratorium: Lista 1 Środowisko programowania

Ćwiczenie 1. Matlab podstawy (1) Matlab firmy MathWorks to uniwersalny pakiet do obliczeń naukowych i inżynierskich, analiz układów statycznych

Haskell Moduły Ładowanie

Pascal - wprowadzenie

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wstęp do programowania

Podstawy Kompilatorów

Ilość cyfr liczby naturalnej

Podstawy JavaScript ćwiczenia

PARADYGMATY PROGRAMOWANIA Wykład 4

Python wstęp do programowania dla użytkowników WCSS

Programowanie obiektowe

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

- nawiasy kwadratowe oznaczają, że to lista

Paradygmaty programowania

Wstęp do programowania. Wykład 1

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

Programowanie w języku Python. Grażyna Koba

1. Wypisywanie danych

Kurs rozszerzony języka Python

PARADYGMATY PROGRAMOWANIA Wykład 3

Wstęp do programowania

Rys.2.1. Drzewo modelu DOM [1]

Wyrażenia arytmetyczne

Wprowadzenie do środowiska

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Podstawy Programowania Obiektowego

Programowanie Komputerów

Wykład 1 Informacje Podstawowe

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

Języki i paradygmaty programowania

WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI I INFORMATYKI INSTYTUT AUTOMATYKI I INFORMATYKI KIERUNEK AUTOMATYKA I ROBOTYKA STUDIA STACJONARNE I STOPNIA

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Python. Wprowadzenie. Jolanta Bachan

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

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Bazy Danych i Usługi Sieciowe

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

operator zmiany znaku operatory mnożenia, dzielenia, dzielenia modulo operatory dodawania, odejmowania

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Zadanie 2: Arytmetyka symboli

Administracja i programowanie pod Microsoft SQL Server 2000

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Wykład 1 Informacje Podstawowe

Wstęp do informatyki. stęp do informatyki Polecenia (cz.2)

Instalacja

Ćwiczenia z wyliczania wartości funkcji

Paradygmaty i języki programowania. Wprowadzenie. dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 1

Programowanie Proceduralne

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Zmienne, stałe i operatory

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Bazy danych i usługi sieciowe

Pracownia Informatyczna Instytut Technologii Mechanicznej Wydział Inżynierii Mechanicznej i Mechatroniki. Podstawy Informatyki i algorytmizacji

ANALIZA DANYCH W STATA 8.0 CZĘŚĆ II

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

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Należy ściągnąć oprogramowanie Apache na platformę

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Common Lisp - funkcje i zmienne

Elementy języka Haskell

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

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

Wartości domyślne, przeciażenia funkcji

Transkrypt:

PROGRAMOWANIE FUNKCYJNE HASKELL WPROWADZENIE HASKELL Nazwa pochodzi od imienia znanego logika Haskell a Brooks a Curry ego (1900-1982) Jest jednym z wielu funkcyjnych języków programowania, do których należą m.in. Lisp, Erlang i inne. Jest językiem czysto funkcyjnym, dzięki czemu nie pozwala na efekty uboczne. Głównym założeniem języków czysto funkcyjnych jest to, że wynik działania funkcji jest uzależniony wyłącznie od przekazywanych jej argumentów. Za każdym razem, gdy wywołamy funkcję z takimi samymi parametrami, zwróci ona taką samą wartość. Jest językiem leniwym (ang. lazy, non strict ), gdyż wyrażenia, które nie są potrzebne, by ustalić odpowiedź na dany problem nie są wyznaczane. Leniwe wartościowanie gwarantuje, że nic nie zostanie policzone niepotrzebnie. Jest językiem stosującym silnie typowanie. Niemożliwa jest więc przypadkowa (niejawna) konwersja, np. Double do Int. Jest zwięzły. Programy są krótsze, dzięki czemu łatwiej jest analizować poszczególne funkcje i lokalizować błędy. Jest językiem wysokiego poziomu programy napisane w Haskellu często są bardzo podobne do opisu algorytmu. Pisząc funkcje na wyższym poziomie abstrakcji i zostawiając szczegóły kompilatorowi, zmniejszamy szanse pojawienia się błędu. Zarządza pamięcią programista zajmuje się jedynie implementacją algorytmu. Jest modularny Haskell oferuje bardzo wiele metod łączenia modułów. Język Haskell, podobnie jak języki obiektowe, umożliwia tworzenie abstrakcyjnych struktur danych, polimorfizm i enkapsulację. Enkapsulacja jest realizowana poprzez umieszczenie każdego typu danych w osobnym module.

NAJBARDZIEJ POPULARNE KOMPILATORY GHC the Glasgow Haskell Compiler Dostępny pod adresem http://www.haskell.org/ghc/ The Haskell Interpreter Hugs Dostępny pod adresem http://haskell.org/hugs/ Polecane wykłady: Ze strony głównej interpretera Hugs wchodzimy kolejno: Haskell 98 Books Graham Hutton Programming in Haskell Slides

SPOSÓB PRACY Z HASKELLEM Haskell umożliwia pracę interaktywną. Praca taka zwana jest sesją. Interpreter Hugs: Hugs 98: Based on the Haskell 98 standard Copyright (c) 1994-2005 --- World Wide Web: http://haskell.org/hugs Bugs: http://hackage.haskell.org/trac/hugs Version: Sep 2006 Haskell 98 mode: Restart with command line option -98 to enable extensions Type :? for help Interpreter Hugs w linii komend wyznacza wartości wyrażeń podane przez użytkownika. Po znaku zachęty wpisujemy wyrażenie, którego wartość chcemy wyznaczyć i naciskamy Enter. W nowej linii otrzymujemy odpowiedź. Jest to wartość wpisanego wyrażenia lub komunikat o błędzie. Hugs > Wyrażenie Wartość wyrażenia Hugs> "Hello!" "Hello!" Hugs> reverse "Hello!" "!olleh" Hugs> "Witaj Haskell" "Witaj Haskell" Hugs> 5*3+4 19 Hugs> sqrt 9 3.0 Hugs> pi^2*5 49.3480220054468 Hugs>

Skrót $$ Możemy użyć tego skrótu, aby odwołać się do ostatnio wyznaczonej wartości, co pozwala na wygodne użycie interpretera. Hugs> 2+3 5 Hugs> 2^$$ ERROR - Syntax error in expression (unexpected end of input) Hugs> 2 ^ $$ 32 Hugs> mod $$ 3 2 Hugs> $$ 'mod' 3 ERROR - Improperly terminated character constant Hugs> $$ `mod` 3 2 Hugs> replivate 3 "hello" ERROR - Undefined variable "replivate" Hugs> replicate 3 "hello" ["hello","hello","hello"] Hugs> concat $$ "hellohellohello" Hugs> length $$ 15 Hugs>

Odpowiedź interpretera a wersja drukowalna Odpowiedź otrzymana z interpretera jest w postaci umożliwiającej jej ponowne użycie, ale możemy ją otrzymać w bardziej tradycyjnej postaci Hugs> "Dzien Dobry" "Dzien Dobry" Hugs> putstr $$ Dzien Dobry Hugs>

Polecenia interpretera W interpreterze dostępne są polecenia wyższego poziomu (meta-level commands) Hugs> :? LIST OF COMMANDS: Any command may be abbreviated to :c where c is the first character in the full name. :load <filenames> load modules from specified files :load clear all files except prelude :also <filenames> read additional modules :reload repeat last load command :edit <filename> edit file :edit edit last module :module <module> set module for evaluating expressions <expr> evaluate expression :type <expr> print type of expression :? display this list of commands :set <options> set command line options :set help on command line options :names [pat] list names currently in scope :info <names> describe named objects :browse <modules> browse names exported by <modules> :main <aruments> run the main function with the given arguments :find <name> edit module containing definition of name :cd dir change directory :gc force garbage collection :version print Hugs version :quit exit Hugs interpreter

Wyznaczanie wartości wyrażeń arytmetycznych. Wartości wyrażeń arytmetycznych możemy wyznaczać bezpośrednio w interpreterze. Uwaga. Funkcje i operatory arytmetyczne mogą być używane zarówno w postaci prefiksowej, jak i infiksowej. Postać prefiksowa: div x y mod x y (+) 5 2 (*) 5 2 Postać infiksowa: x `div` y x `mod` y 5 + 2 5 * 2 Postać infiksowa jest bardziej naturalna dla operatorów arytmetycznych takich jak + - * / a postać prefiksowa dla funkcji arytmetycznych. Hugs> 5+2 7 Hugs> 5-2 3 Hugs> 5*2 10 Hugs> 5/2 2.5 Hugs> (+) 5 2 7 Hugs> (-) 5 2 3 Hugs> (*) 5 2 10 Hugs> (/) 5 2 2.5 Hugs> div 5 2 2 Hugs> mod 5 2 1 Hugs> 5 `div` 2 2 Hugs> 5 `mod` 2 1

Priorytet i łączność operatorów. Operatory arytmetyczne i logiczne Operator Działanie Priorytet Łączność + dodawanie 6 L - odejmowanie 6 L * mnożenie 7 L / dzielenie 7 L ^, ^^, ** potęgowanie 8 P `mod` dzielenie modulo 7 L `div` dzielenie całkowite 7 L < mniejszy 4 N <= mniejszy lub równy 4 N > większy 4 N >= większy lub równy 4 N == równy 4 N /= różny 4 N && AND 3 P OR 2 P Priorytety operatorów decydują o tym, który operator ma pierwszeństwo wykonania przed innym. Priorytet operatora jest liczbą całkowitą z zakresu od 0 do 9 włącznie (im wyższy tym silniejszy). Priorytet 10 jest zarezerwowany dla funkcji. O kolejności wykonywania operatorów oprócz priorytetu decyduje ponadto własność fixity, która określa czy operator wiąże w lewo - L ( left-associative łączny lewostronnie), w prawo - P ( right-associative łączny prawostronnie), czy jest niełączny - N ( nonassociative ).

Polecenie Sprawdź typ łączności operatorów: + i -, * i /, ^, `mod`, `div` wyznaczając wartości wyrażeń: 3 + 4-5 + 1 ((3 + 4) 5) +1 3 + (4 (5 + 1)) 3 * 4 / 2 * 5 ((3 * 4) / 2) * 5 3 *(4 / (2 * 5)) 3 ^ 2 3 ^ 2 ^ 3 (3 ^ 2 ) ^ 3 3 ^ (2 ^ 3) 10 `mod` 6 `mod` 4 (10 `mod` 6) `mod` 4 10 `mod` (6 `mod` 4) 16 `div` 3 `div` 2 (16 `div` 3) `div` 2 16 `div` (3 `div` 2) Sprawdź, że mod jako funkcja ma wyższy priorytet niż operator `mod, wyznaczając wartości wyrażeń: 5 `mod` 2 ^ 3 mod 5 2 ^ 3

Definiowanie i stosowanie funkcji w interpreterze. Jeżeli np. chcemy w interpreterze zdefiniować funkcję argumentu 3 możemy to zrobić na dwa sposoby: 2 kwadrat ( x) = x i zastosować do lub kwadrat 3 where kwadrat x = x * x let kwadrat x = x * x in kwadrat 3 Hugs> kwadrat 3 where kwadrat x = x*x 9 Hugs> let kwadrat x = x*x in kwadrat 3 9 Hugs> kwadrat 5 ERROR - Undefined variable "kwadrat" Hugs> kwadrat(kwadrat 3) where kwadrat x = x*x 81 Hugs> Definiując funkcję w interpreterze można ją wykorzystać tylko w linii, w której została zdefiniowana.

Skrypty Haskell daje możliwość tworzenia definicji złożonych funkcji, które wykorzystujemy w obliczeniach. Zbiór definicji funkcji nazywamy skryptem. Aby definicje funkcji mogły zostać użyte wielokrotnie należy je zapisać za pomocą dowolnego edytora tekstowego i umieścić w pliku z rozszerzeniem.hs. Przykład definicji: suma_ciagu :: Integer -> Integer suma_ciagu x = x * (x+1) `div` 2 Definicja funkcji składa się z dwóch części: 1) opisu typu funkcji, który może być pominięty, jeżeli nie prowadzi to do niejednoznaczności, 2) sposobu wyliczenia wartości funkcji Składnia Haskella, w wielu przypadkach, pozwala obejść się bez znaków średników i przecinków ; ich rolę spełnia odpowiedni układ tekstu.