Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 62 additions & 38 deletions src/Chapter2.hs
Original file line number Diff line number Diff line change
Expand Up @@ -136,43 +136,43 @@ functions in GHCi and insert the corresponding resulting output below:

List of booleans:
>>> :t [True, False]

[True, False] :: [Bool]

String is a list of characters:
>>> :t "some string"

"some string" :: [Char]

Empty list:
>>> :t []

[] :: [a]

Append two lists:
>>> :t (++)

(++) :: [a] -> [a] -> [a]

Prepend an element at the beginning of a list:
>>> :t (:)

(:) :: a -> [a] -> [a]

Reverse a list:
>>> :t reverse

reverse :: [a] -> [a]

Take first N elements of a list:
>>> :t take

take :: Int -> [a] -> [a]

Create list from N same elements:
>>> :t replicate

replicate :: Int -> a -> [a]

Split a string by line breaks:
>>> :t lines

lines :: String -> [String]

Join a list of strings with line breaks:
>>> :t unlines

unlines :: [String] -> String

-}

Expand All @@ -186,31 +186,31 @@ Evaluate the following expressions in GHCi and insert the answers. Try
to guess first, what you will see.

>>> [10, 2] ++ [3, 1, 5]

[10,2,3,1,5]
>>> [] ++ [1, 4] -- [] is an empty list

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

[3,1,2]
>>> 4 : 2 : [5, 10] -- prepend multiple elements

[4,2,5,10]
>>> [1 .. 10] -- list ranges

[1,2,3,4,5,6,7,8,9,10]
>>> [10 .. 1]

[]
>>> [10, 9 .. 1] -- backwards list with explicit step

[10,9,8,7,6,5,4,3,2,1]
>>> length [4, 10, 5] -- list length

3
>>> replicate 5 True

[True,True,True,True,True]
>>> take 5 "Hello, World!"

"Hello"
>>> drop 5 "Hello, World!"

", World!"
>>> zip "abc" [1, 2, 3] -- convert two lists to a single list of pairs

[('a',1),('b',2),('c',3)]
>>> words "Hello Haskell World!" -- split the string into the list of words

["Hello","Haskell","World!"]


👩‍🔬 Haskell has a lot of syntax sugar. In the case with lists, any
Expand Down Expand Up @@ -336,7 +336,9 @@ from it!
ghci> :l src/Chapter2.hs
-}
subList :: Int -> Int -> [a] -> [a]
subList = error "subList: Not implemented!"
subList from to list
| from < 0 || to < 0 || to < from = []
| otherwise = drop from (take (to + 1) list)

{- |
=⚔️= Task 4
Expand All @@ -348,8 +350,8 @@ Implement a function that returns only the first half of a given list.
>>> firstHalf "bca"
"b"
-}
-- PUT THE FUNCTION TYPE IN HERE
firstHalf l = error "firstHalf: Not implemented!"
firstHalf :: [a] -> [a]
firstHalf l = take (div (length l) 2) l


{- |
Expand Down Expand Up @@ -500,7 +502,9 @@ True
>>> isThird42 [42, 42, 0, 42]
False
-}
isThird42 = error "isThird42: Not implemented!"
isThird42:: [Int] -> Bool
isThird42 (_ : _ : 42 : _) = True
isThird42 _ = False


{- |
Expand Down Expand Up @@ -605,7 +609,8 @@ Implement a function that duplicates each element of the list

-}
duplicate :: [a] -> [a]
duplicate = error "duplicate: Not implemented!"
duplicate [] = []
duplicate (x:xs) = x : x : duplicate xs


{- |
Expand All @@ -620,8 +625,18 @@ Write a function that takes elements of a list only on even positions.
>>> takeEven [2, 1, 3, 5, 4]
[2,3,4]
-}
takeEven = error "takeEven: Not implemented!"

takeEven :: [Int] -> [Int]
takeEven [] = []
takeEven [x] = [x]
takeEven (x : _ : xs) = x : takeEven xs

takeEvenGo :: [Int] -> [Int]
takeEvenGo xs = go 0 xs
where
go acc [] = []
go acc (x:xs)
| even acc = x : go (acc +1) xs
| otherwise = go (acc +1) xs
{- |
=🛡= Higher-order functions

Expand Down Expand Up @@ -727,7 +742,7 @@ value of the element itself
🕯 HINT: Use combination of 'map' and 'replicate'
-}
smartReplicate :: [Int] -> [Int]
smartReplicate l = error "smartReplicate: Not implemented!"
smartReplicate = concatMap (\x -> replicate x x)

{- |
=⚔️= Task 9
Expand All @@ -740,7 +755,8 @@ the list with only those lists that contain a passed element.

🕯 HINT: Use the 'elem' function to check whether an element belongs to a list
-}
contains = error "contains: Not implemented!"
contains :: Int -> [[Int]] -> [[Int]]
contains x l = filter (elem x) l


{- |
Expand Down Expand Up @@ -780,13 +796,15 @@ Let's now try to eta-reduce some of the functions and ensure that we
mastered the skill of eta-reducing.
-}
divideTenBy :: Int -> Int
divideTenBy x = div 10 x
divideTenBy = div 10

-- TODO: type ;)
listElementsLessThan x l = filter (< x) l
listElementsLessThan :: Int -> [Int] -> [Int]
listElementsLessThan x = filter (< x)

-- Can you eta-reduce this one???
pairMul xs ys = zipWith (*) xs ys
pairMul :: [Int] -> [Int] -> [Int]
pairMul = zipWith (*)

{- |
=🛡= Lazy evaluation
Expand Down Expand Up @@ -841,7 +859,13 @@ list.

🕯 HINT: Use the 'cycle' function
-}
rotate = error "rotate: Not implemented!"
rotate :: Int -> [a] -> [a]
rotate n l
| n < 0 = []
| null l = []
| otherwise =
let len = length l
in take len (drop (mod n len) (cycle l))

{- |
=💣= Task 12*
Expand All @@ -857,8 +881,8 @@ and reverses it.
function, but in this task, you need to implement it manually. No
cheating!
-}
rewind = error "rewind: Not Implemented!"

rewind :: [a] -> [a]
rewind = foldl (flip (:)) []

{-
You did it! Now it is time to the open pull request with your changes
Expand Down