Funkcionális programozás gyakorlat

6. feladatsor

Beadandó feladat

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]

Szeletek

Kétoperandusú operátorokat lehet félig alkalmazni:

(< 10) 66 < 10
(10 <) 610 < 6

Feladat

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]

Egy apróság

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 #-}

Eszközök

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)

Eszközök

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))

Feladat

A map és filter eszközöket felhasználva oldd meg az alábbi feladatokat.

  1. Sorold fel a 500-nál kisebb négyzetszámokat.
  2. Állítsd elő a 2 hatványait egy végtelen listába.
  3. Állítsd elő az 1, 11, 111, 1111, ... sorozatot.
  4. Állítsd elő az 3, 33, 333, 3333, ... sorozatot.
  5. Állítsd elő az 1, 31, 331, 3331, ... sorozatot.

Feladat

  1. Add meg egy listából a benne található legnagyobb páratlan számot.
  2. Adott elemek listájának listája. Keresd meg a legnagyobbat a belső listák legkisebb elemei közül.

Feladat

  1. Alkalmazd a paraméterben megadott függvényt listák listájában levő elemekre.
mapMap :: (a -> b) -> [[a]] -> [[b]]

Példa:

mapMap (+1) [[1,2,3],[4],[5,6]]
⇒ [[2,3,4],[5],[6,7]]

Feladat

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

Feladat

Add meg egy listához

differences :: [Int] -> [Int]
maxDiff :: [Int]{-véges-} -> Int
maxDistance :: [Int]{-véges-} -> Int

Eszközök

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)), ...]

Eszközök

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)]

Feladat

  1. Állítsd elő az (1,1), (1,2), (2,3), (3,5), (5,8), ... sorozatot. A sorozat előállítási szabálya: (a, b) ↦ (b, a+b).
  2. Állítsd elő az 1, 1, 2, 3, 5, 8, ... sorozatot (ez a Fibonacci-sorozat).
  3. Állítsd elő az Fibonacci-sorozat 1000. elemét (1-től számozva az elemeket).
  4. Állítsd elő a 10100-nál nagyobb Fibonacci-számokat.
  5. Állítsd elő a 106-nál kisebb Fibonacci-számokat.
  6. Állítsd elő a páratlan Fibonacci-számokat.

Feladat

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]

Feladat

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]

Feladat

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"