Maratona de Haskell - Décimo Primeiro Dia - Parte 1
Fala Pessoal!
Ontem nós finalizamos os três primeiros capítulos do livro que estamos acompanhando. Hoje vamos dividir nosso dia em duas partes. Primeiro vamos fazer uma revisão dos 10 primeiros dias e depois alguns exercícios.
Primeiro vamos para uma rápida revisão.
Primeiro Dia
O primeiro dia foi uma básica introdução para o Haskell
e como configurar nosso ambiente. Eu acho que o mais importante foi a dica de usar Docker
porque isso torna tudo mais fácil.
Então instale Docker
, rode o comando docker run -ti –rm -v $(pwd):/code haskell:7.10 bash e aproveite o Haskell
.
Segundo Dia
O segundo dia nós trouxemos um dos mais importantes conceitos em Haskell
que é List
e além disso falamos sobre IF
que é simples e um conceito universal no mundo do desenvolvimento de software.
Vamos ver alguns exemplos de listas:
let numbers = [1,2,3,4]
numbers
[1,2,3,4]
let words = [“car”,”ball”,”gremio”]
words
[“car”, “ball”, “gremio”]
E algo sobre IF
também.
Terceiro Dia
No terceiro dia nós mergulhamos mais no assunto das listas. Aprendemos sobre listas aninhadas, comparação de listas e intervalo de listas:
-- Nested lists
[[1,2,3],[4,5,6]]
[[1,2,3],[4,5,6]]
[['h','e','l','l','o'],['w','o','r','l','d']]
["hello","world"]
-- Comparing lists
let listA = [1,2,3]
let listB = [1,2,3]
let listC = [1,3,4]
listA == listB
True
listA /= listB
False
listA == listC
False
listA >= listC
False
listA <= listC
True
-- Range of lists
[1..20]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
['A'..'s']
"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrs"
Nós também estudamos sobre outros operadores.
Quarto Dia
Durante o quarto dia nós continuamos falando de lista e vimos algum conteúdo sobre Tuples
.
Primeiro uma rápida revisada em um assunto realmente importante que é list comprehension
.
[ x*2 | x <- [1..10], x*2 > 10]
[12,14,16,18,20]
Depois uma olhada em como usar Tuples
em Haskell
.
(1,2)
(1,2)
(1,2,”hello”)
(1,2,”hello”)
(1,2,”hello”, True)
(1,2,”hello”, True)
Quinto Dia
No quinto dia nós estudamos o que são static types
em Haskell
e os tipos válidos que são Int
, Integer
, Float
, Double
, Bool
, Char
e Tuples
.
Nós também vimos como descrobrir os tipos de expressões, valores e funções usando :t
:
:t ‘a’
‘a’ :: Char
:t True
True :: Bool
:t 5
5 :: Num a => a
let fnt x = x
fnt 4
4
fnt ‘a’
‘a’
:t fnt
fnt :: t -> t
Sexto Dia
O sexto dia foi sobre type classes
e que elas não são classes. Nós vimos as mais importantes type classes
em Haskell
.
Sétimo Dia
O sétimo dia foi um dia diferente. Eu fui em um meetup de Haskell
onde o grupo esta seguindo este livro e nós trabalhamos com folds
.
Oitavo Dia
O oitavo dia foi um dia realmente importante porque nós estudamos Pattern Matching
. Este assunto é realmente importante e deve ser revisado. Aqui um exemplo:
month' :: Int -> String
month' 5 = "May"
month' 6 = "June"
month' 7 = "July"
month' 8 = "August"
month' _ = "it is not a valid month"
month 5
"May"
month 6
"June"
month 7
"July"
month 9
"it is not a valid month"
Nono Dia
No nono dia nós vimos algumas outras opções para Pattern Matching
como Guards
e where
.
bmiStatus' :: Double -> Double -> String
bmiStatus' weight height
| bmi <= 18.5 = "You are underweight!"
| bmi <= 25 = "You are with ideal weight!"
| bmi <= 30 = "You are overweight!"
| otherwise = "You are obese!"
where bmi = weight / height ^ 2
bmiStatus’ 85 1.81
"You are overweight!"
bmiStatus’ 80 1.81
"You are with ideal weight!"
bmiStatus’ 60 1.81
"You are underweight!"
bmiStatus’ 100 1.81
"You are obese!"
Décimo Dia
No último dia nós vimos mais opções para Pattern Matching
como let..in
and case..of
:
cylinder :: Double -> Double -> Double
cylinder r h =
let
sideArea = 2 * pi * r * h
topArea = pi * r ^ 2
in
sideArea + 2 * topArea
cylinder 8 10
904.7786842338604
head' :: [a] -> a
head' xs = case xs of
[] -> error "empty list"
(x:_) -> x
head' []
*** Exception: empty list
head' [1]
1
head' [1,2]
1