Adott két lista. Állíts elő egy olyan listát, amelynek hossza megegyezik a rövidebb listáéval, és az eredeti listák elemeitől a következőképpen függenek.
(+++) :: [Int] -> [Int] -> [Int]
[10,11,12] +++ [2,3,8] ⇒ [12,0,4]
Kétoperandusú operátorokat lehet félig alkalmazni:
(< 10) 6 ⇄ 6 < 10
(10 <) 6 ⇄ 10 < 6
Találd ki a következő kifejezések eredményét, majd ellenőrizd.
filter (4<) [1..10]
filter (<4) [1..10]
map (2^) [1..10]
map (^2) [1..10]
map (`mod` 2) [1..10]
map (2 `mod`) [1..10]
Ha a fordító típushibát ad, de a program helyesnek tűnik, a program elejére írt alábbi kódrészlet segíthet:
{-# LANGUAGE NoMonomorphismRestriction #-}
A map
egy lista minden elemét átalakítja. A filter
csak a megadott tulajdonságú elemeket hagyja benne a listában.
map :: (a -> b) -> [a] -> [b]
filter :: (a -> Bool) -> [a] -> [a]
A listagenerátorok kiválthatóak velük:
[f x | x <- xs, tul x] ⇄ map f (filter tul x)
Függvények kompozíciója.
(.) :: (b -> c) -> (a -> b) -> a -> c
Kifejtett működése:
(f . g) x ⇒ f (g x)
(f . g . h) x ⇒ f (g (h x))
A map
és filter
eszközöket felhasználva oldd meg az alábbi feladatokat.
mapMap :: (a -> b) -> [[a]] -> [[b]]
Példa:
mapMap (+1) [[1,2,3],[4],[5,6]]
⇒ [[2,3,4],[5],[6,7]]
Add meg egy név kezdőbetűit és monogramját (ebben pont áll a kezdőbetűk után).
firstLetters :: String -> String
Az alábbi függvények szétbontanak egy szöveget szavakra (szóközök már nem lesznek benne), illetve összeraknak egy szöveget egy-egy szóközzel elválasztva.
words :: String -> [String]
unwords :: [String] -> String
Add meg egy listához
differences :: [Int] -> [Int]
maxDiff :: [Int]{-véges-} -> Int
maxDistance :: [Int]{-véges-} -> Int
Az iterate
egy függvényt alkalmaz egy elemre sorozatosan.
iterate :: (a -> a) -> a -> [a]
Kifejtett működése:
iterate f x ⇒ [x, f x, f (f x), f (f (f x)), ...]
Névtelen függvények: a kód közepén szerepelhetnek.
f x y = x + y -- f nevű függvény
(\x y -> x + y) -- névtelen függvény
Névtelen függvény lehet függvény értéke is:
f x = (\y -> x + y)
Névtelen függvény jól használható pl. map
argumentumában:
map (\(x, y) -> (y, x)) [(1,2),(3,4)]
⇒ [(2,1),(4,3)]
A megadott listában a közvetlen egymás után szereplő, egymással egyenlő elemekből csak egy maradjon.
reduce :: [Int] -> [Int]
reduce [1,2,2,4,4,4,2] ⇒ [1,2,4,2]
Add meg, mely elemek szerepelnek többször a listában.
repeated :: [Int]{-véges-} -> [Int]
repeated [1,2,3,4,2,5,6,7,1] ⇒ [1,2]
A uniq l
legyen az l
-beli elemek listája, de minden elem csak egyszer szerepeljen.
uniq :: Ord a => [a]{-véges-} -> [a]
uniq "Mississippi" ⇒ "Misp"