Języki programowania – Haskell

Transkrypt

Języki programowania – Haskell
Języki programowania – Haskell
zadanie projektowe nr. 4 (2016/17)
T. Goluch
1. Kompilacja, uruchamianie i Hello world
Kompilacja i uruchamianie:
ghc --make hello.hs
./hello
Interaktywny interpreter:
ghci hello.hs
main = putStrLn "Hello world!"
Haskel w przeglądarce:
http://tryhaskell.org/
http://ideone.com/
2. Cechy języka
– wszystko jest funkcją
– funkcja składa się z deklaracji:
nazwa_funkcji::Kwalifikatory_Typu => Typ_Argumentu_1 -> Typ_Argumentu_2 ->
Typ_Wyniku
nazwa_funkcji argument_1 argument_2 = let definicje_podfunkcji in polecenie
zwracające wynik
– podstawowe typy danych (operator :: - czytamy jako: „jest typu”):
True::Bool,
'a'::Char,
1::Int,
1::Integer,
1.0::Double,
"abc"::String (tożsame z listą znaków [Char])
listy: 1:2:3:4:[], 1:2:[3, 4], [1, 2, 3, 4] lub [1, 2 .. 4] lub [1 .. 4]::[Int] – homogeniczne o zmiennej długości
krotki: (1, ‘a’, „litera”) – heterogeniczne o stałej długości
K. Turowski, T. Goluch
Języki programowania
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
1
– funkcje nie są redefiniowalne (w obrębie własnego zakresu) więc np.
x = 2
x = 3
main = print x
nie zadziała
– kolejność funkcji w pliku nie ma znaczenia
main = print x
x = 123
– leniwe wartościowanie - obliczenia są wykonywane TYLKO wtedy, gdy jest to niezbędne np.
podziel :: (RealFrac a) => a -> a -> a
podziel x y = let q = (/) x y in if (abs y) < 0.001 then 0 else q
– ukonkretnianie funkcji
odwroc :: (RealFrac a) => a -> a
odwroc = podziel 1
– składanie funkcji
identycznosc :: (RealFrac a) => a -> a
identycznosc = odwroc . odwroc
3. Silnia i wyrażenia: if … then … else, let…in, where oraz |
silnia :: (Num a, Ord a) => a -> a
silnia n = if n == 1 then 1 else n * silnia (n - 1)
silnia n = let loop n' a = if n' == 1 then a else loop (n' - 1) (a * n')
in loop n 1
silnia n = let loop n' a | n' == 1 = a
| otherwise = loop (n' - 1) (a * n')
in loop n 1
silnia n = loop n 1 where loop n' a | n' == 1 = a
| otherwise = loop (n' - 1) (a * n')
4. Listy, mapy i filtry
– moduł zawierający: import Data.List
– typowe funkcje: head, tail, last, init, reverse, take n
reverse::[a] -> [a]
reverse [] = []
reverse (x:y) = reverse y ++ [x]
– nieskończony ciąg Fibonacciego
fibonacci = 1:1:[(a + b) | (a, b) <- zip fibonacci (tail fibonacci)]
print fibonacci powoduje nieskończoną pętlę,
print (take 1000 fibonacci) działa – bo leniwe wartościowanie
– wykonanie funkcji f na wszystkich elementach listy x
map f x
[f xs | xs <- x]
np.
map cos [1..10]
K. Turowski, T. Goluch
Języki programowania
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
2
map (+1) [1..10]
map (\x -> 3 * x + 2) [1..10]
– wybranie tylko elementów funkcji f na wszystkich elementach listy x
filter f x
np.
filter (>3) [-10..10]
filter (\x -> x * x == 1) [-10..10]
– scalenie dwóch list w listę par (elementy dłuższej listy są odrzucane
zip a b
np.
zip "Mississippi" [-10..10]
5. Tablice1
– moduł zawierający: import Data.Array
– tworzenie tablicy sqr zawierającej kwadraty liczb od 1 do 100
array :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
sqr = array (1,100) [(i, i*i) | i <- [1..100]]
– pobranie kwadratu liczby 7
sqr!7 => 49
– sprawdzenie zakresów wymiarów tablicy
bounds sqr => (1,100)
– rekurencyjne tworzenie tablicy zawierającej liczby Fibonacciego
fibs :: Int -> Array Int Int
fibs n = a where a = array (0,n) ([(0, 1), (1, 1)] ++
[(i, a!(i-2) + a!(i-1)) | i <- [2..n]])
– pobranie 10 elementu ciągu
fibs 10 ! 10 => 89
6. Tablice haszujące
– tworzenie tablicy H z przykładowej listy par
H :: Map Char Int
H = fromList [('a', 3), ('b', 5), ('c', 7)]
– wyszukiwanie elementu x w tablicy H
wynik :: Maybe a
wynik = lookup x H
7. Typy danych
– proste:
data Color = Red | Green | Blue
isRed :: Color -> Bool
isRed Red = True
isRed _ = False
main = print (isRed Blue)
1
https://www.haskell.org/tutorial/arrays.html
K. Turowski, T. Goluch
Języki programowania
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
3
– złożone:
data Chars = Value Char | Join Chars Chars
isChar :: Chars -> Bool
isChar (Value x) = True
isChar _ = False
toString :: Chars -> String
toString (Join x y) = (toString x) ++ (toString y)
toString (Value x) = [x]
main = print (toString (Join (Join (Value 'a') (Value 'b')) (Value 'c')))
8. Funkcje: group, sort
Funkcja group przyjmuje listę i zwraca listę składającą się z list zgrupowanych identycznych kolejnych elementów.
Przykładowo:
group :: Eq a => [a] -> [[a]]
group "Mississippi" = ["M","i","ss","i","ss","i","pp","i"]
Funkcja sort implementuje stabilną wersję algorytmu sortującego. Przykładowo:
sort :: Ord a => [a] -> [a]
sort "Mississippi" = "Miiiippssss"
Funkcje wymagają zaimportowania modułu Data.List
K. Turowski, T. Goluch
Języki programowania
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
{C91E19C4-8B08-4D63-9B7C-0913AAB2A7CE}
4

Podobne dokumenty