8. (mókás) gyakorlat
Jótanács a . operátoros függvényekhez: "Jobbról, Kotlin! Jobbról olvasd!"
numbersMadeOfThrees :: [Integer]
numbersMadeOfThrees = iterate ( (+ 3) . (* 10) ) 3
-- vagy
numbersMadeOfThrees = map (*3) numbersMadeOfOnes
numbersMadeOfThreesAndOne :: [Integer]
numbersMadeOfThreesAndOne = iterate ((+1) . (*10) . (+2)) 1
-- epic, imagine having maths skills
mapMap :: (a -> b) -> [[a]] -> [[b]]
mapMap f xs = map (\x -> map f x) xs
-- vagy
mapMap f xs = map (map f) xs
-- vagy
mapMap f = map (map f)
-- vagy
mapMap = map . map
firstLetters :: String -> String
firstLetters = unwords . map ((:[]) . head) . words
-- vagy
firstLetters = unwords . map (take 1) . words
-- vagy
import Data.List
firstLetters = intersperse ' ' . map head . words
monogram :: String -> String
monogram = unwords . map ((:".") . head) . words
-- vagy
import Data.List
monogram = (++ ".").(intercalate ". " . map (take 1) . words)
uniq :: Ord a => [a] -> [a]
uniq = reduce . sort
-- vagy
uniq = nub . sort -- a `nub` az megjelenési sorrendben szedi ki az ismételt elemeket
-- vagy
uniq = sort . nub
repeated :: Ord a => [a] -> [a]
repeated = map head . filter ((>1) . genericLength) . group . sort
repeated = map head . filter (longerThan 1) . group . sort
where
longerThan :: Integral i => i -> [a] -> Bool
longerThan n [] = n < 0
longerThan n (x:xs) = n <= 0 || longerThan (n-1) xs
until :: (a -> Bool) -> (a -> a) -> a -> a
until p f a = head $ dropWhile (not . p) $ iterate f a
-- vagy
until p f = head . dropWhile (not . p) . iterate f
-- vagy
until p = ((head . dropWhile (not . p)) .) . iterate -- AAAAAAAAAAAAA
Hasznos függvények
uncurry' :: (a -> b -> c) -> ((a, b) -> c)
-- **jobb** zárójel elhagyható:
uncurry' :: (a -> b -> c) -> (a, b) -> c
uncurry' f (a, b) = f a b
curry' :: ((a, b) -> c) -> (a -> b -> c)
-- itt is
curry' :: ((a, b) -> c) -> a -> b -> c
curry' f a b = f (a,b)
all :: (a -> Bool) -> [a] -> Bool
all p xs = and $ map p xs
-- vagy
all p = and . map p
-- vagy
all = (and . ) . map