--filp' :: (a -> b -> c) -> (b -> a -> c) flip' :: (a -> b -> c) -> b -> a -> c flip' f = \x y -> f y x revminus = flip' (-) revminus 2 3 flip' (-) 2 3 flip'' :: (a -> b -> c) -> b -> a -> c flip'' f x y = f y x flip'' (/) 2 10 --f = \(h:t) -> h + 1 --f [10, 20, 30] ($*) :: (a -> b) -> a -> b f $* x = f x addOne = (+1) addOne 10 addOne $* 10 addOne $ 10 -- пример, где есть разница addOne 10 / 2 addOne $ 10 / 2 addOne (10 / 2) (+) (2*2) (3*3) -- (+) $ (2*2) $ (3*3) -- пытается сначала посчитать (2*2) $ (3*3) ((+) $ (2*2)) $ (3*3) -- слишком много скобок (*2) $ (+1) $ 3*3 -- сначала +1, потом *2 (.*) :: (b -> c) -> (a -> b) -> (a -> c) -- g .* f = \x -> g (f x) (g .* f) x = g $ f x fun = (+1) . (*2) fun 42 filter (\x -> x `mod` 2 == 0) [1..10] filter ((==0) . (`mod` 2)) [1..10] -- студент имя, курс, преподаватель только имя -- deriving Show, заклинание, которое позволяет распечатывать значения data Human = Student String Int | Lecturer String deriving Show human1 = Student "John" 1 human2 = Student "Mary" 5 human3 = Lecturer "Ilya" human1 -- работает show human1 :type Student :type Lecturer map Lecturer ["Ilya", "Pavel Petrovich"] data Point = Point Int Int deriving Show Point 1 2 -- использую конструктор типа f :: Point -> Int -- здесь это тип -- чтобы реализовать функцию, используется сопоставление с образцом -- через конструкторы типа f (Point x y) = abs x + abs y -- норма 1ой степени, здесь конструктор f (Point 2 3) getName :: Human -> String getName (Student name _) = name -- номер курса не интересен, _ getName (Lecturer name) = name getName human1 getName human2 getName human3 data Pair a = Pair a a deriving Show p1 = Pair 2 3 p2 = Pair "ABC" "XYZ" -- p3 = Pair 2 "ABC" -- не одинаковый тип swap :: Pair a -> Pair a swap (Pair x y) = Pair y x swap p1 swap $ Pair "ABC" "XYZ" inc :: Pair Int -> Pair Int inc (Pair x y) = Pair (x + 1) (y + 1) inc $ Pair 5 6 -- список чисел data List = Empty | Node Int List deriving Show lst1 = Empty lst2 = Node 10 Empty lst3 = Node 20 lst2 lst33 = Node 20 (Node 10 Empty) -- аналогично предыдущему lst4 = Node 10 (Node 20 (Node 30 Empty)) data List' = Nil | (:*) Int List' deriving Show lst1' = Nil lst2' = 10 :* Nil lst3' = 10 :* (20 :* Nil) length' :: List' -> Int length' Nil = 0 length' (h :* t) = 1 + length' t length' lst3' data List a = Nil | (:*) a (List a) deriving Show "abc" :* ("xyz" :* Nil) -- соответствует "списку" ["abc", "xyz"] take 15 [1..] ones = 1 : ones take 15 ones