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
Written on December 11, 2016