Hello, Haskell! If I break, you can: 1. Restart: M-x haskell-process-restart 2. Configure logging: C-h v haskell-process-log (useful for debugging) 3. General config: M-x customize-mode 4. Hide these tips: C-h v haskell-process-show-debug-tips Changed directory: /home/trifon/fmisync/Courses/2021_22/FP_2021_22/sandbox/lectures/haskell/ λ> :t [] [] :: [a] λ> :t "" "" :: [Char] λ> "" == [] True λ> 2:[] [2] λ> head [1,2,3] 1 λ> head [] *** Exception: Prelude.head: empty list λ> tail [1,2,3] [2,3] λ> tail [] *** Exception: Prelude.tail: empty list λ> tail [1,2,3] [2,3] λ> head [1,2,3] 1 λ> null [1,2,3] False λ> null [] True λ> length [1,2,3] 3 λ> length [] 0 λ> length [1,2,3] 3 λ> length [] 0 λ> [1..10] [1,2,3,4,5,6,7,8,9,10] λ> ['a'..'e'] "abcde" λ> [1.23..4.56] [1.23,2.23,3.23,4.23] λ> enumFromTo 1.23 4.56 [1.23,2.23,3.23,4.23] λ> enumFromTo 1 10 [1,2,3,4,5,6,7,8,9,10] λ> succ 'a' 'b' λ> succ 1.23 2.23 λ> enumFromTo 'a' 'e' "abcde" λ> enumFromTo 1.23 4.56 [1.23,2.23,3.23,4.23] λ> :t enumFromTo enumFromTo :: (Ord a, Enum a) => a -> a -> [a] λ> :t enumFromTo enumFromTo :: (Ord a, Num a) => a -> a -> [a] λ> :t enumFromTo enumFromTo :: (Ord a, Enum a) => a -> a -> [a] λ> :t enumFromThenTo enumFromThenTo :: (Ord a, Num a) => a -> a -> a -> [a] λ> [1,4..15] [1,4,7,10,13] λ> enumFromThenTo 1 4 15 [1,4,7,10,13] λ> ['a','e'..'z'] "aeimquy" λ> [1..5] ++ [10..20] [1,2,3,4,5,10,11,12,13,14,15,16,17,18,19,20] λ> [1..5] ++ [10..20] [1,2,3,4,5,10,11,12,13,14,15,16,17,18,19,20] λ> [1..5] ++ [] [1,2,3,4,5] λ> :t (++) (++) :: [a] -> [a] -> [a] λ> reverse [1..5] [5,4,3,2,1] λ> :t reverse reverse :: [[a]] -> [a] λ> reverse [[1,2,3],[4,5,6],[7,8,9]] [7,8,9,4,5,6,1,2,3] λ> reverse [1..5] [5,4,3,2,1] λ> reverse [[1,2,3],[4,5,6],[7,8,9]] [[7,8,9],[4,5,6],[1,2,3]] λ> "Haskell" !! 2 's' λ> "Haskell" !! 2 's' λ> [1..10] !! 6 7 λ> [1..10] !! (-1) *** Exception: Невалиден индекс! CallStack (from HasCallStack): error, called at /home/trifon/fmisync/Courses/2021_22/FP_2021_22/sandbox/lectures/haskell/Lists.hs:43:14 in main:Lists λ> elem 3 [1..5] True λ> elem 10 [1..5] False λ> :t elem elem :: (Foldable t, Eq a) => a -> t a -> Bool λ> elem 10 [1..5] False λ> elem 3 [1..5] True λ> 3 `elem` [1..5] True λ> 3 ∈ [1..5] True λ> 10 ∈ [1..5] False λ> 10 `elem` [1..5] False λ> 10 `elem` [1..5] False λ> 3 `elem` [1..5] True λ> 3 `елемент_на` [1..5] True λ> :t elem elem :: Eq a => a -> [a] -> Bool λ> :t елемент_на елемент_на :: Eq a => a -> [a] -> Bool λ> :t (++[]) (++[]) :: [a] -> [a] λ> :t reverse reverse :: [a] -> [a] λ> show 15 "15" λ> show 1.23 "1.23" λ> show (1,2) "(1,2)" λ> show [(1,2),(3,4)] "[(1,2),(3,4)]" λ> read "1" *** Exception: Prelude.read: no parse λ> (read "1")::Int 1 λ> (read "1")::Double 1.0 λ> (read "1")::String "*** Exception: Prelude.read: no parse λ> (read "1")::Char *** Exception: Prelude.read: no parse λ> (read "[1,2]")::[Int] [1,2] λ> (read "[(1,2),(3,4)]")::[(Int,Int)] [(1,2),(3,4)] λ> :t Prelude.length Prelude.length :: Foldable t => t a -> Int λ> :t Prelude.enumFromTo Prelude.enumFromTo :: Enum a => a -> a -> [a] λ> :t 2 2 :: Num p => p λ> 2 == length [1,2] True λ> :t 2.3 2.3 :: Fractional p => p λ> 2.3 == length [1,2] False λ> :t length [1,2] length [1,2] :: Num p => p λ> :t length [1,2] length [1,2] :: Int λ> False < True True λ> [(x,y) | x <- [1..5], y <- [6..10]] [(1,6),(1,7),(1,8),(1,9),(1,10),(2,6),(2,7),(2,8),(2,9),(2,10),(3,6),(3,7),(3,8),(3,9),(3,10),(4,6),(4,7),(4,8),(4,9),(4,10),(5,6),(5,7),(5,8),(5,9),(5,10)] λ> [x +y | x <- [1..5], y <- [6..10]] [7,8,9,10,11,8,9,10,11,12,9,10,11,12,13,10,11,12,13,14,11,12,13,14,15] λ> [x * y | x <- [1..5], y <- [6..10], x + y <= 14] [6,7,8,9,10,12,14,16,18,20,18,21,24,27,30,24,28,32,36,40,30,35,40,45] λ> pythagoreanTriples 1 10 [(3,4,5),(4,3,5),(6,8,10),(8,6,10)] λ> pythagoreanTriples 1 10 [(3,4,5),(6,8,10)] λ> pythagoreanTriples 1 10 [(3,4,5)] λ> pythagoreanTriples 1 100 [(3,4,5),(5,12,13),(7,24,25),(8,15,17),(9,40,41),(11,60,61),(12,35,37),(13,84,85),(16,63,65),(20,21,29),(28,45,53),(33,56,65),(36,77,85),(39,80,89),(48,55,73),(65,72,97)] λ> pythagoreanTriples 1 1000 [(3,4,5)Interrupted. λ> pythagoreanTriples 1 1000 [(3,4,5),(5,12,13),(8,15,17),(7,24,25),(20,21,29),(12,35,37),(9,40,41),(28,45,53),(11,60,61),(16,63,65),(33,56,65),(48,55,73),(13,84,85),(36,77,85),(39,80,89),(65,72,97),(20,99,101),(60,91,109),(15,112,113),(44,117,125),(88,105,137),(17,144,145),(24,143,145),(51,140,149),(85,132,157),(119,120,169),(52,165,173),(19,180,181),(57,176,185),(104,153,185),(95,168,193),(28,195,197),(84,187,205),(133,156,205),(21,220,221),(140,171,221),(60,221,229),(105,208,233),(120,209,241),(32,255,257),(23,264,265),(96,247,265),(69,260,269),(115,252,277),(160,231,281),(161,240,289),(68,285,293),(136,273,305),(207,224,305),(25,312,313),(75,308,317),(36,323,325),(204,253,325)Interrupted. λ> pythagoreanTriples 1 1000 [(3,4,5),(5,12,13),(8,15,17),(7,24,25),(20,21,29),(12,35,37),(9,40,41),(28,45,53),(11,60,61),(16,63,65),(33,56,65),(48,55,73),(13,84,85),(36,77,85),(39,80,89),(65,72,97),(20,99,101),(60,91,109),(15,112,113),(44,117,125),(88,105,137),(17,144,145),(24,143,145),(51,140,149),(85,132,157),(119,120,169),(52,165,173),(19,180,181),(57,176,185),(104,153,185),(95,168,193),(28,195,197),(84,187,205),(133,156,205),(21,220,221),(140,171,221)Interrupted. λ> init [1..5] [1,2,3,4] λ> init [1..5] [1,2,3,4] λ> init [] *** Exception: /home/trifon/fmisync/Courses/2021_22/FP_2021_22/sandbox/lectures/haskell/Lists.hs:(75,1)-(76,21): Non-exhaustive patterns in function init λ> last [1..5] 5 λ> last [] *** Exception: /home/trifon/fmisync/Courses/2021_22/FP_2021_22/sandbox/lectures/haskell/Lists.hs:(79,1)-(80,19): Non-exhaustive patterns in function last λ> take 4 [1..10] [1,2,3,4] λ> take 4 [1..10] [1,2,3,4] λ> take 0 [1..10] [] λ> drop 4 [1..10] [5,6,7,8,9,10] λ> concat [[1,2,3],[4,5,6],[7,8,9]] [1,2,3,4,5,6,7,8,9] λ> f2 5 2 λ> f2 10 2 λ> f2 [1..4] 2 λ> :t f2 f2 :: b -> Integer λ> map (+1) [1..5] [2,3,4,5,6] λ> map (+1) [1..5] [2,3,4,5,6] λ> map (+1) [1..5] [2,3,4,5,6] λ> filter (>3) [1..5] [4,5] λ> filter (>3) [1..5] [4,5] λ> filter (\f -> f 2 > 3) [(^2),(+1),(*3)] filter (\f -> f 2 > 3) [(^2),(+1),(*3)] :: (Num a, Ord a) => [a -> a] λ> [ (x,y) | x <- [1..3], y <- [4..6] ] [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] λ> map (\x -> x) [1..3] [1,2,3] λ> map (\x -> map (\y -> (x, y)) [4..6]) [1..3] [[(1,4),(1,5),(1,6)],[(2,4),(2,5),(2,6)],[(3,4),(3,5),(3,6)]] λ> concat (map (\x -> map (\y -> (x, y)) [4..6]) [1..3]) [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] λ> concatMap (\x -> map (\y -> (x, y)) [4..6]) [1..3] [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] λ> concatMap (\z -> concatMap (\x -> map (\y -> (x, y)) [4..6]) [1..3]) [7..9] [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6),(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6),(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] λ> concatMap (\z -> concatMap (\x -> map (\y -> (x, y, z)) [4..6]) [1..3]) [7..9] [(1,4,7),(1,5,7),(1,6,7),(2,4,7),(2,5,7),(2,6,7),(3,4,7),(3,5,7),(3,6,7),(1,4,8),(1,5,8),(1,6,8),(2,4,8),(2,5,8),(2,6,8),(3,4,8),(3,5,8),(3,6,8),(1,4,9),(1,5,9),(1,6,9),(2,4,9),(2,5,9),(2,6,9),(3,4,9),(3,5,9),(3,6,9)] λ> take 10 (enumF 2) [2,3,4,5,6,7,8,9,10,11] λ>