Ćwiczymy funkcje wyzszego rzedu
incAll :: [[Int]] -> [[Int]]
która zwiększy o 1 każdy element każdego elementu swojego argumentu, np
*Main Data.List> incAll $ inits [1..3] [[],[2],[2,3],[2,3,4]]
concat :: [[a]] -> [a]
Rozważmy typ drzew troche inny niz na wykladzie
Tree a = Empty | Node a (Tree a) (Tree a) deriving (Eq, Ord, Show)
-- class Functor f where -- fmap :: (a -> b) -> f a -> f b instance Functor Tree where... *Tree> fmap (+1) $ Node 1 Empty Empty Node 2 Empty Empty
toList :: Tree a -> [a]
ktora zamieni drzewo w liste elementow drzewa (w porzadku infiksowym)
insert :: (Ord a) => a -> Tree a -> Tree a contains :: (Ord a) -> a -> Tree a -> Bool fromList :: (Ord a) => [a] -> Tree a
instance Functor (Either e) where -- fmap :: (a -> b) -> Either e a -> Either e b
reverseRight :: Either e [a] -> Either e [a]
odwracajaca liste zawarta w Right
(dwie wersje, bezposrednio i z uzyciem fmap)
class Functor f => Pointed f where pure :: a -> f a
i jej instancje dla list, Maybe, Tree
Importy i moduły biblioteczne, np. przecwiczyć http://learnyouahaskell.com/modules
readInts :: String -> [Int]
która odczyta z napisu występujące w nim liczby naturalne, np
*Main> readInts "1 23 456 7.8 abc 9" [1,23,456,9] *Main> readInts "foo" []
użyj funkcji isDigit
z modulu Data.Char
oraz funkcji map
, filter
, all
z Prelude
readInts2 :: String -> Either String [Int]
która da listę liczb, jeśli wszystkie slowa jej argumentu są liczbami a komunikat o błędzie w przeciwnym przypadku
Może sie przydać funkcja reverseRight
z zad. 3b (lub fmap
dla Either
)
*Main> readInts2 "1 23 456 foo 9" Left "Not a number: foo" *Main> readInts2 "1 23 456" Right [1,23,456]
sumInts :: String -> String
stwórz program uruchamiający funkcję sumInts przy pomocy interact.
Rozważmy typ dla wyrażeń arytmetycznych z let:
data Exp = IntE Int -- stała całkowita | OpE Op Exp Exp -- operacja, np e1 + e2 | VarE String -- zmienna | LetE String Exp Exp -- let var = e1 in e2 type Op = (Int -> Int -> Int, String) -- (działanie, nazwa)
testExp2 :: Exp testExp2 = (2 + 2) * 3
(metody abs i signum mogą mieć wartość undefined)