Export translations
Jump to navigation
Jump to search
Settings
Group
FP Homework 1
FP Laboratory 1
FP Laboratory 10
FP Laboratory 11
FP Laboratory 12
FP Laboratory 2
FP Laboratory 3
FP Laboratory 4
FP Laboratory 5
FP Laboratory 6
FP Laboratory 7
FP Laboratory 9
Functional programming
Main Page
Language
aa - Afar
ab - Abkhazian
abs - Ambonese Malay
ace - Achinese
ady - Adyghe
ady-cyrl - Adyghe (Cyrillic script)
aeb - Tunisian Arabic
aeb-arab - Tunisian Arabic (Arabic script)
aeb-latn - Tunisian Arabic (Latin script)
af - Afrikaans
ak - Akan
aln - Gheg Albanian
am - Amharic
an - Aragonese
ang - Old English
anp - Angika
ar - Arabic
arc - Aramaic
arn - Mapuche
arq - Algerian Arabic
ary - Moroccan Arabic
arz - Egyptian Arabic
as - Assamese
ase - American Sign Language
ast - Asturian
atj - Atikamekw
av - Avaric
avk - Kotava
awa - Awadhi
ay - Aymara
az - Azerbaijani
azb - South Azerbaijani
ba - Bashkir
ban - Balinese
bar - Bavarian
bbc - Batak Toba
bbc-latn - Batak Toba (Latin script)
bcc - Southern Balochi
bcl - Central Bikol
be - Belarusian
be-tarask - Belarusian (Taraškievica orthography)
bg - Bulgarian
bgn - Western Balochi
bh - Bhojpuri
bho - Bhojpuri
bi - Bislama
bjn - Banjar
bm - Bambara
bn - Bangla
bo - Tibetan
bpy - Bishnupriya
bqi - Bakhtiari
br - Breton
brh - Brahui
bs - Bosnian
btm - Batak Mandailing
bto - Iriga Bicolano
bug - Buginese
bxr - Russia Buriat
ca - Catalan
cbk-zam - Chavacano
cdo - Min Dong Chinese
ce - Chechen
ceb - Cebuano
ch - Chamorro
cho - Choctaw
chr - Cherokee
chy - Cheyenne
ckb - Central Kurdish
co - Corsican
cps - Capiznon
cr - Cree
crh - Crimean Turkish
crh-cyrl - Crimean Tatar (Cyrillic script)
crh-latn - Crimean Tatar (Latin script)
cs - Czech
csb - Kashubian
cu - Church Slavic
cv - Chuvash
cy - Welsh
da - Danish
de - German
de-at - Austrian German
de-ch - Swiss High German
de-formal - German (formal address)
din - Dinka
diq - Zazaki
dsb - Lower Sorbian
dtp - Central Dusun
dty - Doteli
dv - Divehi
dz - Dzongkha
ee - Ewe
egl - Emilian
el - Greek
eml - Emiliano-Romagnolo
en - English
en-ca - Canadian English
en-gb - British English
eo - Esperanto
es - Spanish
es-419 - Latin American Spanish
es-formal - español (formal)
et - Estonian
eu - Basque
ext - Extremaduran
fa - Persian
ff - Fulah
fi - Finnish
fit - Tornedalen Finnish
fj - Fijian
fo - Faroese
fr - French
frc - Cajun French
frp - Arpitan
frr - Northern Frisian
fur - Friulian
fy - Western Frisian
ga - Irish
gag - Gagauz
gan - Gan Chinese
gan-hans - Gan (Simplified)
gan-hant - Gan (Traditional)
gcr - Guianan Creole
gd - Scottish Gaelic
gl - Galician
glk - Gilaki
gn - Guarani
gom - Goan Konkani
gom-deva - Goan Konkani (Devanagari script)
gom-latn - Goan Konkani (Latin script)
gor - Gorontalo
got - Gothic
grc - Ancient Greek
gsw - Swiss German
gu - Gujarati
gv - Manx
ha - Hausa
hak - Hakka Chinese
haw - Hawaiian
he - Hebrew
hi - Hindi
hif - Fiji Hindi
hif-latn - Fiji Hindi (Latin script)
hil - Hiligaynon
ho - Hiri Motu
hr - Croatian
hrx - Hunsrik
hsb - Upper Sorbian
ht - Haitian Creole
hu - Hungarian
hu-formal - magyar (formal)
hy - Armenian
hyw - Western Armenian
hz - Herero
ia - Interlingua
id - Indonesian
ie - Interlingue
ig - Igbo
ii - Sichuan Yi
ik - Inupiaq
ike-cans - Eastern Canadian (Aboriginal syllabics)
ike-latn - Eastern Canadian (Latin script)
ilo - Iloko
inh - Ingush
io - Ido
is - Icelandic
it - Italian
iu - Inuktitut
ja - Japanese
jam - Jamaican Creole English
jbo - Lojban
jut - Jutish
jv - Javanese
ka - Georgian
kaa - Kara-Kalpak
kab - Kabyle
kbd - Kabardian
kbd-cyrl - Kabardian (Cyrillic script)
kbp - Kabiye
kg - Kongo
khw - Khowar
ki - Kikuyu
kiu - Kirmanjki
kj - Kuanyama
kjp - Eastern Pwo
kk - Kazakh
kk-arab - Kazakh (Arabic script)
kk-cn - Kazakh (China)
kk-cyrl - Kazakh (Cyrillic script)
kk-kz - Kazakh (Kazakhstan)
kk-latn - Kazakh (Latin script)
kk-tr - Kazakh (Turkey)
kl - Kalaallisut
km - Khmer
kn - Kannada
ko - Korean
ko-kp - Korean (North Korea)
koi - Komi-Permyak
kr - Kanuri
krc - Karachay-Balkar
kri - Krio
krj - Kinaray-a
krl - Karelian
ks - Kashmiri
ks-arab - Kashmiri (Arabic script)
ks-deva - Kashmiri (Devanagari script)
ksh - Colognian
ku - Kurdish
ku-arab - Kurdish (Arabic script)
ku-latn - Kurdish (Latin script)
kum - Kumyk
kv - Komi
kw - Cornish
ky - Kyrgyz
la - Latin
lad - Ladino
lb - Luxembourgish
lbe - Lak
lez - Lezghian
lfn - Lingua Franca Nova
lg - Ganda
li - Limburgish
lij - Ligurian
liv - Livonian
lki - Laki
lmo - Lombard
ln - Lingala
lo - Lao
loz - Lozi
lrc - Northern Luri
lt - Lithuanian
ltg - Latgalian
lus - Mizo
luz - Southern Luri
lv - Latvian
lzh - Literary Chinese
lzz - Laz
mai - Maithili
map-bms - Basa Banyumasan
mdf - Moksha
mg - Malagasy
mh - Marshallese
mhr - Eastern Mari
mi - Maori
min - Minangkabau
mk - Macedonian
ml - Malayalam
mn - Mongolian
mni - Manipuri
mnw - Mon
mo - Moldovan
mr - Marathi
mrj - Western Mari
ms - Malay
mt - Maltese
mus - Creek
mwl - Mirandese
my - Burmese
myv - Erzya
mzn - Mazanderani
na - Nauru
nah - Nāhuatl
nan - Min Nan Chinese
nap - Neapolitan
nb - Norwegian Bokmål
nds - Low German
nds-nl - Low Saxon
ne - Nepali
new - Newari
ng - Ndonga
niu - Niuean
nl - Dutch
nl-informal - Nederlands (informeel)
nn - Norwegian Nynorsk
no - Norwegian
nov - Novial
nrm - Norman
nso - Northern Sotho
nv - Navajo
ny - Nyanja
nys - Nyungar
oc - Occitan
olo - Livvi-Karelian
om - Oromo
or - Odia
os - Ossetic
pa - Punjabi
pag - Pangasinan
pam - Pampanga
pap - Papiamento
pcd - Picard
pdc - Pennsylvania German
pdt - Plautdietsch
pfl - Palatine German
pi - Pali
pih - Norfuk / Pitkern
pl - Polish
pms - Piedmontese
pnb - Western Punjabi
pnt - Pontic
prg - Prussian
ps - Pashto
pt - Portuguese
pt-br - Brazilian Portuguese
qqq - Message documentation
qu - Quechua
qug - Chimborazo Highland Quichua
rgn - Romagnol
rif - Riffian
rm - Romansh
rmy - Vlax Romani
rn - Rundi
ro - Romanian
roa-tara - Tarantino
ru - Russian
rue - Rusyn
rup - Aromanian
ruq - Megleno-Romanian
ruq-cyrl - Megleno-Romanian (Cyrillic script)
ruq-latn - Megleno-Romanian (Latin script)
rw - Kinyarwanda
sa - Sanskrit
sah - Sakha
sat - Santali
sc - Sardinian
scn - Sicilian
sco - Scots
sd - Sindhi
sdc - Sassarese Sardinian
sdh - Southern Kurdish
se - Northern Sami
sei - Seri
ses - Koyraboro Senni
sg - Sango
sgs - Samogitian
sh - Serbo-Croatian
shi - Tachelhit
shi-latn - Tachelhit (Latin script)
shi-tfng - Tachelhit (Tifinagh script)
shn - Shan
shy-latn - Shawiya (Latin script)
si - Sinhala
simple - Simple English
sk - Slovak
skr - Saraiki
skr-arab - Saraiki (Arabic script)
sl - Slovenian
sli - Lower Silesian
sm - Samoan
sma - Southern Sami
sn - Shona
so - Somali
sq - Albanian
sr - Serbian
sr-ec - Serbian (Cyrillic script)
sr-el - Serbian (Latin script)
srn - Sranan Tongo
ss - Swati
st - Southern Sotho
stq - Saterland Frisian
sty - cебертатар
su - Sundanese
sv - Swedish
sw - Swahili
szl - Silesian
ta - Tamil
tay - Tayal
tcy - Tulu
te - Telugu
tet - Tetum
tg - Tajik
tg-cyrl - Tajik (Cyrillic script)
tg-latn - Tajik (Latin script)
th - Thai
ti - Tigrinya
tk - Turkmen
tl - Tagalog
tly - Talysh
tn - Tswana
to - Tongan
tpi - Tok Pisin
tr - Turkish
tru - Turoyo
ts - Tsonga
tt - Tatar
tt-cyrl - Tatar (Cyrillic script)
tt-latn - Tatar (Latin script)
tum - Tumbuka
tw - Twi
ty - Tahitian
tyv - Tuvinian
tzm - Central Atlas Tamazight
udm - Udmurt
ug - Uyghur
ug-arab - Uyghur (Arabic script)
ug-latn - Uyghur (Latin script)
uk - Ukrainian
ur - Urdu
uz - Uzbek
uz-cyrl - Uzbek (Cyrillic script)
uz-latn - Uzbek (Latin script)
ve - Venda
vec - Venetian
vep - Veps
vi - Vietnamese
vls - West Flemish
vmf - Main-Franconian
vo - Volapük
vot - Votic
vro - Võro
wa - Walloon
war - Waray
wo - Wolof
wuu - Wu Chinese
xal - Kalmyk
xh - Xhosa
xmf - Mingrelian
xsy - Saisiyat
yi - Yiddish
yo - Yoruba
yue - Cantonese
za - Zhuang
zea - Zeelandic
zgh - Standard Moroccan Tamazight
zh - Chinese
zh-cn - Chinese (China)
zh-hans - Simplified Chinese
zh-hant - Traditional Chinese
zh-hk - Chinese (Hong Kong)
zh-mo - Chinese (Macau)
zh-my - Chinese (Malaysia)
zh-sg - Chinese (Singapore)
zh-tw - Chinese (Taiwan)
zu - Zulu
Format
Export for off-line translation
Export in native format
Fetch
{{DISPLAYTITLE:FP Cvičení 11}}== Složitá datová struktura == Uvažujme následující datovou strukturu reprezentující nějaký druh grafického uživatelského rozhraní. <syntaxhighlight lang="Haskell"> data Point = Point {column::Int,row::Int} deriving (Show) data Position = Position {leftTopCorner :: Point, width :: Int, height :: Int} data Component = TextBox {name :: String, position :: Position, text :: String} | Button {name :: String, position :: Position, text :: String} | Container {name :: String, children :: [Component]} </syntaxhighlight> Jako příklad můžeme použít následující datovou strukturu. <syntaxhighlight lang="Haskell"> gui :: Component gui = Container "My App" [ Container "Menu" [ Button "btn_new" (Position (Point 0 0) 100 20) "New", Button "btn_open" (Position (Point 100 0) 100 20) "Open", Button "btn_close" (Position (Point 200 0) 100 20) "Close" ], Container "Body" [TextBox "textbox_1" (Position (Point 0 20) 300 500) "Some text goes here"], Container "Footer" [] ] </syntaxhighlight> * Přidejte typ <code>Component</code> do typove třídy <code>Show</code>. Výsledek pro naše data z předchozího příkladu by měl vypadat takto. <syntaxhighlight lang="Haskell" class="myDark"> ghci> gui Container - My App Container - Menu (0,0)[100,20] Button[btn_new]: New (100,0)[100,20] Button[btn_open]: Open (200,0)[100,20] Button[btn_close]: Close Container - Body (0,20)[300,500] TextBox[textbox_1]: Some text goes here Container - Footer </syntaxhighlight> <div class="mw-collapsible mw-collapsed" data-collapsetext="Hide solution" data-expandtext="Show solution"> <syntaxhighlight lang="Haskell"> instance Show Position where show (Position (Point col row) width height) = "(" ++ show col ++ "," ++ show row ++ ")["++ show width++","++ show height++"]" instance Show Component where show :: Component -> String show gui = showIndent "" gui where showIndent ind (TextBox name position text) = ind ++ show position ++ " TextBox[" ++ name ++ "]: " ++ text ++"\n" showIndent ind (Button name position text) = ind ++ show position ++ " Button[" ++ name ++ "]: " ++ text ++"\n" showIndent ind (Container name children) = let inner = concat[showIndent (ind++"\t") c |c<-children] in ind ++ "Container - " ++ name ++ "\n" ++ inner </syntaxhighlight> </div> <div style="clear:both"></div> * Vytvořte funkci <code>insertInto</code>, která vloží prvek do existujícího kontejneru z GUI. Parametry funkce budou: ** prvním parametrem bude GUI, do kterého budeme vkládat nový prvek; ** druhým parametrem bude název kontejneru, do kterého vkládáme nový prvek, lze bezpečně předpokládat, že bude vždy existovat. Prvek bude v kontejneru umístěn jako poslední; ** posledním parametrem je vložený prvek. <syntaxhighlight lang="Haskell"> insertInto :: Component -> String -> Component -> Component </syntaxhighlight> <syntaxhighlight lang="Haskell" class="myDark"> ghci> insertInto gui "Footer" (TextBox "Done" (Position (Point 0 500) 300 10) "We are done!") Container - My App Container - Menu (0,0)[100,20] Button[btn_new]: New (100,0)[100,20] Button[btn_open]: Open (200,0)[100,20] Button[btn_close]: Close Container - Body (0,20)[300,500] TextBox[textbox_1]: Some text goes here Container - Footer (0,500)[300,10] TextBox[Done]: We are done! </syntaxhighlight> <div class="mw-collapsible mw-collapsed" data-collapsetext="Hide solution" data-expandtext="Show solution"> <syntaxhighlight lang="Haskell"> insertInto :: Component -> String -> Component -> Component insertInto (Container cName children ) toName element | cName == toName = Container cName (children++[element]) | otherwise = Container cName [insertInto c toName element |c<-children] insertInto x toName element = x </syntaxhighlight> </div> <div style="clear:both"></div> * Create a function <code>deleteFrom</code>, it will delete an element from the existing container from a GUI. The functions parameters will be: ** first parameter will be the GUI, where we are deleting the element; ** second parameter is the name of the component, that will be removed, you can safely assume, that it will always exist; <syntaxhighlight lang="Haskell"> deleteFrom :: Component -> String -> Component </syntaxhighlight> <syntaxhighlight lang="Haskell" class="myDark"> ghci> deleteFrom gui "btn_close" Container - My App Container - Menu (0,0)[100,20] Button[btn_new]: New (100,0)[100,20] Button[btn_open]: Open Container - Body (0,20)[300,500] TextBox[textbox_1]: Some text goes here Container - Footer </syntaxhighlight> <div class="mw-collapsible mw-collapsed" data-collapsetext="Hide solution" data-expandtext="Show solution"> <syntaxhighlight lang="Haskell"> deleteFrom :: Component -> String -> Component deleteFrom (Container x child) target = Container x [deleteFrom c target |c<-child, name c /=target ] deleteFrom c _ = c </syntaxhighlight> </div> <div style="clear:both"></div> * Rozšiřte definici tlačítka v našem GUI takto. <syntaxhighlight lang="Haskell"> data Event = MouseEvent Point | KeyEvent {keyPressed::Char} deriving (Show) ... | Button {name :: String, position :: Position, text :: String, onClick :: Maybe (Event -> String)} ... </syntaxhighlight> Naše '''onClick''' je funkce, která se spustí po kliknutí na tlačítko. Parametrem této funkce jsou data popisující událost, která se osluhu spustila. <syntaxhighlight lang="Haskell"> ... [ Button "btn_new" (Position (Point 0 0) 100 20) "New" (Just (\event -> "Clicked on new button.")), Button "btn_open" (Position (Point 100 0) 100 20) "Open" Nothing, Button "btn_close" (Position (Point 200 0) 100 20) "Close" (Just (\event -> "Clicked on close button.")) ] ... </syntaxhighlight> * Vytvořte funkci <code>clickOnButton</code>, která dostane naše GUI a nějakou událost. Pokud je parametrem instance <code>MouseEvent</code> a pozice, na kterou jsme klikli, je uvnitř některého z tlačítek GUI, pak vyhodnotí odpovídající funkci <code>onClick</code> a výsledkem bude získáný řetězec. Ve všech ostatních případech bude výsledkem <code>Nothing</code>. <syntaxhighlight lang="Haskell"> clickOnButton :: Component -> Event -> Maybe String </syntaxhighlight> <syntaxhighlight lang="Haskell" class="myDark"> ghci> clickOnButton gui (MouseEvent (Point 5 5)) Just "Clicked on new button." ghci> clickOnButton gui (MouseEvent (Point 205 5)) Just "Clicked on close button." ghci> clickOnButton gui (MouseEvent (Point 205 50)) Nothing </syntaxhighlight> <div class="mw-collapsible mw-collapsed" data-collapsetext="Hide solution" data-expandtext="Show solution"> <syntaxhighlight lang="Haskell"> isInside :: Point -> Position -> Bool isInside (Point pCol pRow) (Position (Point cornerCol cornerRow) width height) = cornerCol <= pCol && pCol <= cornerCol + width && cornerRow <= pRow && pRow <= cornerRow + height getFirstOrNothing :: [Maybe a] -> Maybe a getFirstOrNothing [] = Nothing getFirstOrNothing (Nothing:xs) = getFirstOrNothing xs getFirstOrNothing (Just x: xs) = Just x clickOnButton :: Component -> Event -> Maybe String clickOnButton (Button {position = pos, onClick = (Just func)}) (MouseEvent point) | isInside point pos = Just (func (MouseEvent point)) clickOnButton (Container {children=inner}) event = getFirstOrNothing [clickOnButton c event |c<-inner] clickOnButton _ _ = Nothing </syntaxhighlight> </div> <div style="clear:both"></div> == Doplňková cvičení == * Uvažujme následující definici a příklad m-árního stromu. <syntaxhighlight lang="Haskell"> data MTree a = MTree a [MTree a] </syntaxhighlight> <syntaxhighlight lang="Haskell"> testTree1 :: MTree Int testTree1 = MTree 1 [(MTree 2 [(MTree 3 []),(MTree 4 [(MTree 5 []),(MTree 6 [])]), (MTree 7 []),(MTree 8 [])]), (MTree 9 [])] </syntaxhighlight> * Vytvořte funkci, která sečte všechny hodnoty uložené ve stromu m-ary. <syntaxhighlight lang="Haskell"> msum :: MTree Int -> Int </syntaxhighlight> * Vytvořte funkci, která extrahuje všechny hodnoty z m-arního strimu do seznamu. <syntaxhighlight lang="Haskell"> mToList :: MTree a -> [a] </syntaxhighlight> * Vytvořte funkci, která spočítá všechny listy v m-arním stromu. <syntaxhighlight lang="Haskell"> mLeafCount :: MTree a -> Int </syntaxhighlight> * Vytvořte funkci, která najde maximální hodnotu uloženou v m-árním stromu. <syntaxhighlight lang="Haskell"> mMaxTree :: Ord a => MTree a -> a </syntaxhighlight> * Vytvoření funkce, která zkontroluje, zda je daný prvek uložen v m-árním stromu. <syntaxhighlight lang="Haskell"> mContains :: Eq a => MTree a -> a -> Bool </syntaxhighlight> * Vytvoření funkce, která vrátí počet prvků větších než zadaná hodnota. <syntaxhighlight lang="Haskell"> mGreaterThan :: Ord a => MTree a -> a -> Int </syntaxhighlight>
Navigation menu
Personal tools
English
Log in
Namespaces
Special page
Variants
Views
More
Search
Main page
Education
Functional programming
Functional programming - presentations
Functional programming - laboratories
Programming Languages and Compilers
Practical Functional Programming
History Entries
Programming paradigms
C#
Tools
Special pages
Printable version