Haskell – úvod do jazyka Flashcards
Opis Haskell
čistý (pure) funkcionálny jazyk, t.j. bez vedľajších účinkov
monadický V/V (monadic I/O) (až v 1996)
lenivé (lazy, non-strict) vyhodno. argumentov
statická typová kontrola
zaviedol triedy typov (type classes)
Opis lenive vyhodnocovanie
modulárne programovanie potrebuje dobré lepidlo
* efektívnejšie skladanie funkcií: any plist = or(map plist)
* nekonečné dátové štruktúry (nat = 1:map (+1) nat)
Ake su 2 implementacie haskellu?
Glasgow Haskell Compiler (GHC) - kompiluje do zdrojoveho kodu
Haskell User’s Gofer System (Hugs) - interpreter
Ake service pozname na balicky?
Hackage, Stack, Cabal
Ako viem vytvorit cez stack novy program?
stack new meno-projektu meno-šablóny
cim vacsinou zacina haskell file?
module Main (main) where
Co robi :t <expr>?</expr>
ukáže typ <expr></expr>
Co robi :i <name>?</name>
Zobrazi info o <name></name>
Co robi :l <module>?</module>
nahrá <module></module>
Co robi :set <option>?</option>
nastaví <option> (opak je :unset <option>)</option></option>
Co robi :p <name>?</name>
ukáže hodnotu <name> bez vynútenia vyhodnotenia</name>
Co spravi :sp <name>?</name>
zjednodušene ukáže hodnotu <name> bez vynútenia vyhodnotenia</name>
Ake su zakladne typy haskell?
data Bool = False | True
data Char≈’a’ | ’A’ | ’b’ | ’B’ |…
data [] a = [] | a : [a]
type String = [Char]
N-tice: (a,b,c)
Unit:data () = ()
Ake pozname integral typy?
- Integer: celé čísla ľubovoľnej veľkosti (aka BigInt)
- Int: celé čísla pevnej presnosti (8 bajtov)
⟨−9223372036854775808, 9223372036854775807⟩ - Word: nezáporné celé čísla pevnej presnosti (8 bajtov)
⟨0, 18446744073709551615⟩
Co je to Ratio?
a: racionálne čísla nad a (denominator (10 % 4) 2)
Ake pozname realfloat typy?
- Float: reálne čísla jednoduchá presnosť (4 bajty)
- Double: reálne čísla dvojitá presnosť (8 bajtov)
Ako zapisujeme komplexne cisla?
- import Data.Complex
- (0 :+ 1) * (0 :+ 1) (-1.0) :+ 0.0
Opis identifikatory
začínajú písmenom
môžu obsahovať písmená, cifry, podčiarkovník _ a apostrof ’
sú rozdelené do dvoch menných priestorov: premenne zacinaju malym a konstruktore velkym
identifikátor _ dont care
Ako piseme komenty?
– koment
{-koment-}
{-# direktíva #-}, napríklad zapnutie všetkých upozornení: {-# OPTIONS_GHC -Wall #-}
Ako vieme odsadzovat kod?
but len taby alebo aj {} a ; na zaciatku riadku
Aku pozname precedenciu operatorov?
Zľava asociatívne
Neasociatívne
Sprava asoc.
Co este je dolezite pri precedencii operatorov?
Priorita
Opis rezy
(# e) ≡ \x -> x # e
slide 24
Ako spravit funkciu infixovu?
(f x y)≡(x ‘f‘ y)
Cim negujeme?
not
Ako spravime zaporne cislo?
negate, alebo do zatvorky napr (-3)
Ako testujeme nerovnost?
/=
V zoznamoch, ake mame operacie s O(1)?
:, tail, head
Ako vraciame i-ty prvok zoznamu?
[10,11,12]!!2
Co robi init init :: [a] -> [a]?
vynechá posledný prvok (O(n))
Ako zistim i-ty prvok zoznamu?
[10,11,12]!!2
ak mame typ instancie triedy Enum, tak mozeme robit…
- [e1 ..] ≡ enumFrom e1
- [e1,e2 ..] ≡ enumFromThen e1 e2
- [e1 .. e3] ≡ enumFromTo e1 e3
- [e1, e2 .. e3] ≡ enumFromThenTo e1 e2 e3
Co je teda [ .. ]?
Iba syntakticky cukor
[1,3..] = [1,3,5,7,9,11,13,15,17,19,21,… [False ..] = [False,True]
Opis list comprehensions
[e|q1, . . . , qn], n ≥ 1,
qi je:
* generátor tvaru p<-e, kde p je vzor typu t a e je výraz typu [t]
* let var=exp, pričom var je použiteľné v e a nasled. kvalifik.
* stráž (boolean guard), ľubovoľný výraz typu Bool
Co robi transpose?
Transponuje maticu
Co robi zip?
[a] -> [b] -> [(a, b)]