GADT, moduly, ADT, typy ranku-n ... Flashcards
čo to sú fantómové typy?
znemožnia vytvorenie sémanticky nekorektných výrazov
slide 4
Aký je problém pri fantómových typoch?
Nevieme definovať múdru verziu Lt, ani eval, (slide 5)
Co to su GADTs?
Generalized algebraic datatypes
umožňujú obmedziť návratovú hodnotu dátového konštruktora
pri ADT by musel byť Expr a
pri GADT môže byť napr. Expr Int alebo Expr Bool
slide 6
Ako spravit eval cez GADTs?
slide 8
Co je to modul?
modul je zoskupenie vzájomne súvisiacich funkcií, typov, typových tried, konštánt, . . .
program je zoskupenie modulov
moduly importujú iné moduly a volajú ich funkcie
program sa spúšťa zavolaním hlavnej (main) funkcie z Main modulu
Ake su vyhody rozdelenia programu do modulov?
kontrola menného priestoru (menej kolízií mien)
slabo previazané moduly (loosely coupled) - väčšia znovupoužiteľnosť, ľahšie rozdelenie práce, rýchlejší vývoj
ukrytie implementačných detailov
umožňuje vytváranie abstraktných dátových typov
Aka je syntax modulov?
názvy modulov sú alfanumerické, začínajú veľkým písmenom
modul s názvom Meno je v súbore s názvom Meno.hs
pokiaľ je názvom modulu zložených z viac názvov oddelených
bodkou, tak názvy pred bodkou sú adresáre
Co exportujeme akym nazvoslovim?
module Meno ({-exportované názvy-}) where
module Meno where exportuje všetky názvy
pokial subor nezacina module tak sa predpoklada
module Main(main) where
Opis exporty a importy na slide 11, 12
slide 11,12
Naco nam je import qualified?
zabraňuje kolízii názvov (name clash)
Co je to abstraktny datovy typ?
dátový typ spolu s operáciami nad týmto typom, pričom sa ukrývaju implementačné detaily (vrátane štruktúry typu)
dostupné operácie nazývame rozhranie (interface) ADT
napr. Data.Map a Data.Set
Opis ADT zasobnika
slide 14
Co znamena ze normalne typy su v haskell ranku-1?
a → b → a je ekvival.:
forall a. (a -> forall b. (b -> a))
forall a b. a -> b -> a
Aky je problem s f::a->(a,Int), fx=(x,1)?
Očakávali by sme, že funkcia g f x y = (f x, f y) po zavolaní g2 f True ’a’ vráti ((True,1),(’a’,1)). V skutočnosti však funkcii g Haskell odvodil typ:
g::(a->b)->a->a->(b,b)
Potrebujeme typ ranku-2
Ako s typmi ranku 2? Aky typ chceme?
slide 17
co je zakladom pre typy vyssieho ranku?
System F (alebo druho-rádový λ-kalkulus)
Co je to typ ranku n?
typ ranku-n je funkcia, ktorá má aspoň jeden argument ranku-(n-1), ale žiadny argument vyššieho ranku
Ako v HS zapisat funkciu ranku n?
slide 18
opis co sa deje na slide 19
slide 19
Co je to bezbodovy styl?
Bezbodový štýl, je štýl zápisu funkcie, pri ktorom sa v tele funkcie nespomínajú argumenty (body) v ktorých sa funkcia vyhodnocuje.
Daj priklady na pointfree upravy
slide 20
co sa deje na slide 23?
pointfree prepis
slide 23 pozri
Kedy je vyraz v WHNF? (Weak head normal form)
výraz je vo WHNF, ak jeho najvonkajšejšia časť je:
* konštruktor (True, Just (1+2), (:) (1+2) rest)
* lambda abstrakcia (\x -> výraz)
* neúplná aplikácia vstavanej funkcie ((+) 2, sqrt)
Pozri si priklady na vyrazy v WHNF a nie v nej
slide 24
Kedy je vyraz v NF? (Normal form)
výraz je v normálnej forme (NF), keď je plne vyhodnotený (žiadny podvýraz už nemôže byť ďalej vyhodnotený)
Daj priklady vyrazov v NF a nie v nej
slide 25
Aky je vztah NF a WHNF?
výraz je NF ⇒ výraz je vo WHNF
Co robi seq?
najzákladnejší spôsob ako zaviesť striktnosť do Haskellu
funkcia seq :: a -> b -> b
* berie dva argumenty ľubovoľného typu
* vracia hodnotu druhého argumentu
* ako vedľajší efekt vyhodnotí prvý argument do WHNF
Preco foldl’ nemusi vzdy fungovat?
slide 27
Co to je bang pattern?
- f1 !x = True – vyhodnotí x do WHNF
- f2 (!x, y) = [x,y] – vyhodnotí x, ale nie y
- f3 !(x,y) = [x,y] = f4 (x,y) = [x,y]
- let !z = x–vyhodnotíxdoWHNF
na co je deepseq?
poskytuje funkcie pre úplné vyhodnotenie dátových
štruktúr (NF)
Daj priklad na deepseq
slide 29
Co to su immutable datove struktury?
po vytvorení už nemôžu byť modifikované
môžeme vytvoriť novú štruktúru vychádzajúcu zo starej,
ale starú nemôžeme modifikovať (update in-place)
Ake su vyhody immutable struktur?
ľahšie sa o nich uvažuje - majú iba jeden stav a v tom ostávajú
viac-vláknová bezpečnosť (thread safety), je read-only
ľahko sa dajú zdieľať
zabraňujú vedľajším efektom
stará a nová verzia zdieľajú spoločné časti
ľahko sa zisťuje ktorá časť bola v novej verzii modifikovaná (oproti starej verzii)
daj priklady na immutable v Java, C#, …
slide 31
Mame aj v haskelli mutable struktury?
Ano
import Data.STRef (newSTRef, modifySTRef’, readSTRef)
Co je to lexikalny scoping?
funkcia môže používať iba lexikálne viditeľné premenné v čase definície
bez closures – ak by tieto premenné mohli medzi definíciou a volaním zaniknúť, je to chyba
s closures – použité premenné ∃ v čase definície existujú v uzávere funkcie aj ak by medzitým mali zaniknúť
Co je to dynamicky scoping?
(nepoužíva closures) – premenné sa vždy berú z aktuálneho prostredia (môže obsahovať premenné, ktoré nie sú lexikálne dostupné v čase definície)
Ake jazyky pouzivaju closures?
Napr javascript
Kde mame typovu inferenciu?
C++ auto
C# var
Java Arrays.asList