-
-
Notifications
You must be signed in to change notification settings - Fork 842
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Finished Chapter 1 #571
base: main
Are you sure you want to change the base?
Finished Chapter 1 #571
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -209,31 +209,31 @@ | |||||
> Try to guess first and then compare your expectations with GHCi output | ||||||
|
||||||
>>> :t True | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
True :: Bool | ||||||
>>> :t 'a' | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
'a' :: Char | ||||||
>>> :t 42 | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
42 :: Num a => a | ||||||
|
||||||
A pair of boolean and char: | ||||||
>>> :t (True, 'x') | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
(True, 'x') :: (Bool, Char) | ||||||
|
||||||
Boolean negation: | ||||||
>>> :t not | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
not :: Bool -> Bool | ||||||
|
||||||
Boolean 'and' operator: | ||||||
>>> :t (&&) | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
(&&) :: Bool -> Bool -> Bool | ||||||
|
||||||
Addition of two numbers: | ||||||
>>> :t (+) | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
(+) :: Num a => a -> a -> a | ||||||
|
||||||
Maximum of two values: | ||||||
>>> :t max | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
max :: Ord a => a -> a -> a | ||||||
|
||||||
You might not understand each type at this moment, but don't worry! You've only | ||||||
started your Haskell journey. Types will become your friends soon. | ||||||
|
@@ -301,43 +301,43 @@ | |||||
functions and operators first. Remember this from the previous task? ;) | ||||||
|
||||||
>>> 1 + 2 | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
3 | ||||||
|
||||||
>>> 10 - 15 | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
-5 | ||||||
|
||||||
>>> 10 - (-5) -- negative constants require () | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
15 | ||||||
|
||||||
>>> (3 + 5) < 10 | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
True | ||||||
|
||||||
>>> True && False | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
False | ||||||
|
||||||
>>> 10 < 20 || 20 < 5 | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
True | ||||||
|
||||||
>>> 2 ^ 10 -- power | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
1024 | ||||||
|
||||||
>>> not False | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
True | ||||||
|
||||||
>>> div 20 3 -- integral division | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
6 | ||||||
|
||||||
>>> mod 20 3 -- integral division remainder | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
2 | ||||||
|
||||||
>>> max 4 10 | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
10 | ||||||
|
||||||
>>> min 5 (max 1 2) | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
2 | ||||||
|
||||||
>>> max (min 1 10) (min 5 7) | ||||||
<INSERT THE RESULT INSTEAD OF THE TEXT> | ||||||
5 | ||||||
|
||||||
Because Haskell is a __statically-typed__ language, you see an error each time | ||||||
you try to mix values of different types in situations where you are not | ||||||
|
@@ -429,6 +429,7 @@ | |||||
49 | ||||||
-} | ||||||
|
||||||
squareSum :: Int -> Int -> Int | ||||||
squareSum x y = (x + y) * (x + y) | ||||||
|
||||||
|
||||||
|
@@ -449,7 +450,7 @@ | |||||
function body with the proper implementation. | ||||||
-} | ||||||
next :: Int -> Int | ||||||
next x = error "next: not implemented!" | ||||||
next x = (x + 1 ) | ||||||
|
||||||
{- | | ||||||
After you've implemented the function (or even during the implementation), you | ||||||
|
@@ -490,8 +491,12 @@ | |||||
whether it works for you! | ||||||
-} | ||||||
-- DON'T FORGET TO SPECIFY THE TYPE IN HERE | ||||||
lastDigit n = error "lastDigit: Not implemented!" | ||||||
|
||||||
lastDigit :: Int -> Int | ||||||
lastDigit n | ||||||
| n < 0 = mod (negate n) 10 | ||||||
| n `mod` 10 == 0 = 0 | ||||||
| otherwise = n `mod` 10 | ||||||
Comment on lines
+498
to
+499
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice! It could be simplified a bit though :) This is actually could be combined into just one case, because in case of While doing this simplification, you can notice that it actually could be just 1 case if you use |
||||||
|
||||||
{- | | ||||||
=⚔️= Task 6 | ||||||
|
@@ -519,8 +524,9 @@ | |||||
👩🔬 Due to lazy evaluation in Haskell, only the expression from the branch | ||||||
satisfying the check will be returned and, therefore, evaluated. | ||||||
-} | ||||||
|
||||||
closestToZero :: Int -> Int -> Int | ||||||
closestToZero x y = error "closestToZero: not implemented!" | ||||||
closestToZero x y = if abs x > abs y then y else x | ||||||
|
||||||
|
||||||
{- | | ||||||
|
@@ -554,7 +560,11 @@ | |||||
Casual reminder about adding top-level type signatures for all functions :) | ||||||
-} | ||||||
|
||||||
mid x y z = error "mid: not implemented!" | ||||||
mid :: Int -> Int -> Int -> Int | ||||||
mid x y z | ||||||
Check warning on line 564 in src/Chapter1.hs GitHub Actions / Build Learn4Haskell (3.8, 9.4.4)
|
||||||
| (y <= x && x <= z) || (z <= x && x <= y) = x | ||||||
| (x <= y && y <= z) || (z <= y && y <= x) = y | ||||||
| (x <= z && z <= y) || (y <= z && z <= x) = z | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As we mentioned, the compiler in Haskell is very attentive to the exhaustive pattern-matching. And here it would warn you that Because of that, you will need to use another guard –
Suggested change
|
||||||
|
||||||
{- | | ||||||
=⚔️= Task 8 | ||||||
|
@@ -568,7 +578,12 @@ | |||||
>>> isVowel 'x' | ||||||
False | ||||||
-} | ||||||
isVowel c = error "isVowel: not implemented!" | ||||||
|
||||||
isVowel :: Char -> Bool | ||||||
isVowel c | ||||||
| elem c "aeiou" = True | ||||||
| otherwise = False | ||||||
Comment on lines
+583
to
+585
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice one! 👍🏼 isVowel c = elem c "aeiou" One note in here, that sometimes, |
||||||
|
||||||
|
||||||
|
||||||
{- | | ||||||
|
@@ -631,9 +646,14 @@ | |||||
Try to introduce variables in this task (either with let-in or where) to avoid | ||||||
specifying complex expressions. | ||||||
-} | ||||||
sumLast2 :: Int -> Int | ||||||
|
||||||
sumLast2 n = error "sumLast2: Not implemented!" | ||||||
|
||||||
sumLast2 n = | ||||||
let last = if n < 0 then mod (negate n) 100 else mod n 100 | ||||||
Check warning on line 652 in src/Chapter1.hs GitHub Actions / Build Learn4Haskell (3.8, 9.4.4)
|
||||||
first = div last 10 | ||||||
second = mod last 10 | ||||||
Comment on lines
+653
to
+654
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That is a wonderful solution! 👏🏼 You correctly noticed that it is the One hint to make your solution even shorter: you can see that you use both: mod m 10
div m 10 The standard library has the So you could write it this way: (x, y) = divMod m 10 You can see how we could pattern match on the pair 🙂 |
||||||
sumLast = first + second | ||||||
in sumLast | ||||||
|
||||||
{- | | ||||||
=💣= Task 10* | ||||||
|
@@ -653,10 +673,13 @@ | |||||
aren't ready for this boss yet! | ||||||
-} | ||||||
|
||||||
firstDigit n = error "firstDigit: Not implemented!" | ||||||
|
||||||
|
||||||
firstDigit :: Int -> Int | ||||||
firstDigit n = | ||||||
let value = if n < 0 then negate n else n | ||||||
result = if value >= 10 then firstDigit(div value 10) else value | ||||||
in result | ||||||
{- | ||||||
|
||||||
You did it! Now it is time to open a pull request with your changes | ||||||
and summon @vrom911 for the review! | ||||||
-} | ||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The brackets are not necessary here