Függvénykompozíció

Függvénykompozíció [*]

A függvénykompozíció definíciója:

infixr 9 .
(.) :: (b -> c) -> (a -> b) -> (a -> c)

Test>
[3, 5, 7, 9] :: [Integer]

Feladat: 1, 11, 111, 1111, … [*]

Állítsuk elő az 1, 11, 111, 1111, … sorozatot!

numbersMadeOfOnes :: [Integer]

Test>
[1, 11, 111, 1111] :: [Integer]
Test>
11111111111111111111 :: Integer

Feladat: 3, 33, 333, 3333, …

Állítsuk elő a 3, 33, 333, 3333, … sorozatot!

numbersMadeOfThrees :: [Integer]

Test>
[3, 33, 333, 3333] :: [Integer]
Test>
33333333333333333333 :: Integer

Feladat: 1, 31, 331, 3331, …

Állítsuk elő az 1, 31, 331, 3331, … sorozatot!

numbersMadeOfThreesAndOne :: [Integer]

Test>
[1, 31, 331, 3331] :: [Integer]
Test>
33333333333333333331 :: Integer

Feladat: Szóközök eldobása elölről

dropSpaces :: String -> String

Test>
"hi h i " :: String

Feladat: Szóközök eldobása elölről és hátulról [*]

trim :: String{-véges-} -> String

Test>
"hi h i" :: String

Feladat: Minimumok maximuma

Adott elemek listájának listája. Keressük meg a legnagyobbat a legkisebb elemek közül!

maximumOfMinimums :: Ord a => [[a]] -> a

Test>
3 :: Integer

Feladat: Dupla map [*]

Alkalmazzunk egy függvényt listák listájában levő elemekre!

mapMap :: (a -> b) -> [[a]] -> [[b]]

Test>
[[2, 3], [4, 5]] :: [[Integer]]

Feladat: Kezdőbetűk

Egy névnek adjuk meg a kezdőbetűit!

firstLetters :: String -> String

Test>
"J C" :: String
Test>
"I S P" :: String

Feladat: Monogram [*]

Egy névnek adjuk meg a monogramját!

monogram :: String -> String

Test>
"J. C." :: String
Test>
"I. S. P." :: String
Test>
"K. W. F. D. G. R. S." :: String

Feladat: Egymás utáni ismétlődő elemek kihagyása

A reduce l hagyja el l-ből az egymás utáni ismétléseket!

reduce :: Eq a => [a] -> [a]

Test>
[1, 2, 4, 2] :: [Integer]

Segítség. Alkalmazzuk a group függvényt.

Feladat: Egyedi elemek [*]

A uniq l legyen az l-beli elemek listája, de minden elem csak egyszer szerepeljen!

uniq :: Ord a => [a]{-véges-} -> [a]

Test>
"Mips" :: [Char]

Segítség. A működési elv:

Compositionea985beafff243751ab0cc87d8a249ca.png

Feladat: Ismétlődő elemek [*]

A repeated l legyen azon l-beli elemek listája, amelyek többször szerepelnek l-ben!

repeated :: Ord a => [a]{-véges-} -> [a]

Test>
[1, 2] :: [Integer]

Segítség. A működési elv:

Compositionde0822f939f203ddac925ef5464da237.png

Feladat: Részsorozatok [*]

sublists :: [a] -> [[a]]

Test>
["a", "ab", "b", "abc", "bc", "c", "abcd", "bcd", "cd", "d"] :: [[Char]]
Test>
["a", "ab", "b", "aba", "ba", "a", "abac", "bac", "ac", "c"] :: [[Char]]
Test>
[[1], [1, 2], [2], [1, 2, 3], [2, 3], [3]] :: [[Integer]]

Feladat: Adott hosszúságú részlisták

Adjuk vissza egy lista összes adott hosszúságú részlistáját!

subListWithLength :: Int -> [a] -> [[a]]

Test>
["eia", "iao", "aou"] :: [[Char]]

Feladat: Adott számnál nem hosszabb részlisták

Adjuk vissza egy lista adott számnál nem hosszabb részlistáit!

subListWithMaxLength :: Int -> [a] -> [[a]]

Test>
["e", "ei", "eia", "i", "ia", "iao", "a", "ao", "aou", "o", "ou", "u"] :: [[Char]]

Feladat: Prelude.until [*]

Definiáljuk újra az until függvényt!

until :: (a -> Bool) -> (a -> a) -> a -> a

Test>
10 :: Integer
Test>
1024 :: Integer

Segítség. Iteráljuk a függvényt a kezdőértékre! A kapott listából szűrjük ki azokat az elemeket, amelyekre igaz a feltétel, majd vegyük az így kapott lista fejét.