Magasabbrendű függvények kombinálása

group és groupBy

A Data.List modul két függvénye:

group :: Eq a => [a] -> [[a]]
group = groupBy (==)
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
Test>
[[1], [2, 2], [1, 1, 1]] :: [[Integer]]
Test>
["ab", "1", "2", "cd"] :: [[Char]]
Test>
[[1, 2], [3, 4], [5]] :: [[Integer]]

Legyen f :: a -> a -> Bool függvény. Ha f x y == True és f y z == True esetén f x z == True bármely x, y, z-re, akkor groupBy f úgy viselkedik, hogy ,,összeragasztja’’ azokat az egymás melletti elemeket, amelyekre igaz f.

Az on függvény [*]

on :: (b -> b -> c) -> (a -> b) -> (a -> a -> c)

Test>
True :: Bool
Test>
False :: Bool
Test>
True :: Bool

Feladat: Szövegbeli számok kiszedése [*]

Szedjük ki a szövegben szereplő számokat!

numbersInString :: String -> [String]

Test>
["34", "24", "48"] :: [String]

Feladat: Párok listájának tömörítése

Tömörítsünk párok listáját úgy, hogy az egymás melletti azonos első elemű párokat összevonjuk!

compressPairs :: Eq a => [(a,b)] -> [(a,[b])]

Test>
[(1, ["alma", "fa"]), (8, ["kacsa", "x"]), (1, ["y"])] :: [(Integer, [[Char]])]

Feladat: Legtöbb osztóval rendelkező számok

Soroljuk fel nagyság szerint azokat a természetes számokat, amelyeknek több osztója van, mint a nála kisebb számoknak!

maxDivisors :: [Int]
 -- scanl1 max

Test>
[1, 2, 4, 6, 12, 24, 36, 48, 60] :: [Int]

A megoldás akkor ér többet, ha minden számnak csak egyszer számolja ki az osztóinak a számát.

compare és Ordering

compare :: Ord a => a -> a -> Ordering
Test>
LT :: Ordering
Test>
EQ :: Ordering
Test>
GT :: Ordering

Az Ordering egy háromértékű adattípus.

maximumBy, minimumBy és sortBy

maximumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a
minimumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
Test>
"fa" :: [Char]
Test>
"ablak" :: [Char]
Test>
"alm" :: [Char]
Test>
["fa", "ablak", "alm"] :: [[Char]]

Feladat: Szöveg leghosszabb szava [*]

Keressük meg egy szövegnek az egyik leghosszabb szavát!

longestWord :: String -> String

Test>
"leghosszabb" :: String

Feladat: Legtöbbször előforduló karakter

Egy adott szövegben melyik karakter fordul elő legtöbbször?

mostFrequentChar :: String -> Char

Test>
'a' :: Char

Feladat: Origóhoz legközelebbi pont

Keressük meg egy koordinátákkal adott pontsorozatban az origóhoz legközelebbi pontot!

closestToOrigo :: Real a => [(a, a)] -> (a, a)

Test>
(8 :% 5, -4 :% 5) :: (Rational, Rational)

Feladat: Hányadik elem volt a legnagyobb? [*]

Keressük meg egy listában, hogy melyik indexű elem volt a legnagyobb (1-gyel kezdve az indexelést)!

maxIndex :: Ord a => [a] -> Int

Test>
4 :: Int

Feladat: Nagyság szerinti sorrend indexekkel [*]

Rendezzünk egy listát, és adjuk meg az elemek indexét az eredeti listában (1-gyel kezdve az indexelést)!

maxIndices :: Ord a => [a] -> [Int]

Test>
[2, 3, 1, 4] :: [Int]

Feladat: Legtöbb osztóval rendelkező szám

Keressük meg az 1 és n közötti egész számok közül azt, amelyiknek a legtöbb osztója van!

maxDivisorsUntil :: Integer -> Integer

Test>
96 :: Integer
Test>
180 :: Integer

Feladat: Prelude.flip [*]

Definiáljuk újra a flip függvényt (amely egy kétargumentumú függvény argumentumait fordítja meg)!

flip :: (a -> b -> c) -> (b -> a -> c)

Test>
-3 :: Integer
Test>
[7, 5, 3, 1] :: [Integer]